Anleitung: http://digistump.com/wiki/digispark/tutorials/connecting
An P1 ist die BUILTIN-LED angeschlossen.
An P3 ist über 22Ω der USB mit 1,5k PullUp und einer Zenerdiode 3,6V nach Masse
geklemmt ('W4' BZT52C3V6)
an P4 ist über 22Ω der USB angeschlossen und mit Zenerdiode 3,6V nach Masse geklemmt ('W4'),
die bereits bei 1,93V beginnt zu leiten
An P5 ist RESET (kann über die
Fuse RSTDISBL deaktiviert werden und als GPIO verwendet werden)
Channel | Port | Arduino |
---|---|---|
ADC0 | P5 | analogRead(0) |
ADC1 | P2 | analogRead(1) |
ADC2 | P4 | analogRead(2) |
ADC3 | P3 | analogRead(3) |
ADC4 | Temp | analogRead(4) |
Der ATtiny wurde mit Bootloader geliefert. Falls dieser ersetzt werden muss, ist ein SPI-Programmer nötig. Dazu kann ein anderer Arduino mit dem Beispiel-Sketch "ArduinoISP" dienen, oder ein anderer SPI-Programmer z.B. basierend auf dem CH341A.
Der gängige Bootloader micronucleus versucht nach einem Start/Reset über USB eine Verbindung für den ISP herzustellen - das verzögert den Programmstart um ca. 5 Sekunden. Es gibt alternative Kompilate, bei denen der ISP z.B. nur nach einem Reset über P5 ausgeführt wird. Dieser Bootloader kann mit einem Bootloader-Upgrade-Programm oder einem SPI-Programmer installiert werden:
Kann so erzeugt werden:
"c:\Program Files\Arduino\hardware\tools\avr\bin\avr-objdump.exe" -S R:\TEMP\arduino_build_416650\MySketch.ino.elf > r:\sketch.txt
%LOCALAPPDATA%\Arduino15\packages\arduino\tools\avr-gcc\4.8.1-arduino5\bin\avr-objdump -S %TEMP%\arduino_build_120996\GSMAlarm.ino.elf >"D:\Eigene Dateien\Documents\Arduino\ATTiny\GSMAlarm.s"
Die Fuses werden über SPI bearbeitet:
Zur Berechnung der Fuses gibt es Fuse-Calculatoren:
Beschreibung der Argumente: https://www.nongnu.org/avrdude/user-manual/avrdude_4.html
An PB4 kann der (ggfs. geteilte) Systemtakt ausgegeben werden.
Ausgeliefert wurde der Digispark mit lfuse=0xe1, hfuse=0xdd, efuse=0xfe, lock=0xff.
Für CKOUT muss lfuse=0xa1 gesetzt sein:
Zum einen gibt es den Pin-Change-Interrupt 0 (PCI0), der von allen Pins ausgelöst werden kann (wenn so eingestellt), und den External Interrupt 0 (INT0) an PB2. Weiterhin kann auch der analoge Komparator den Interrupt auslösen.
INT0 kann bei steigender oder fallender Flanke, oder auf Low-Level triggern. Soll auf eine Flanke getriggert werden, muss die I/O-Clock laufen, d.h. nur im Idle-Mode.
Wird INT0 zum Aufwecken und als Level-Interrupt verwendet, kann es bei kurzen Impulsen passieren, dass zwar aufgeweckt wird, aber der Interrupt nicht ausgelöst wird.
Aus dem Sleep "Power Down" kann aufgeweckt werden durch:
Um darüber hinaus die Stromaufnahme zu reduzieren, kann:
Mit der Z-Diode und dem 1,5k-PullUp-Widerstand, über dem sich ein Spannungsabfall von 1,1V ergibt, fließt also ein Strom von 0,733mA. So habe ich bei 4,1V gemessen:
Der Takt des ATtiny85 auf dem Digispark beträgt 16,5MHz - abweichend von 16,0MHz für eine bessere Stabilität des USB-Taktes. Dazu wird OSCCAL entsprechend modifiziert.
Soll eine niedrige Versorgungsspannung benutzt werden, muss der Takt reduziert werden. Damit entfällt allerdings der USB-Anschluss, da dieser mind. 12MHz braucht. Der USB-Treiber ist im Micronucleus auf den CPU-Takt zugeschnitten. https://github.com/ArminJo/micronucleus-firmware/tree/master/firmware/usbdrv
In den Electrical Characteristics ist ein Diagramm zu finden, auf dem die
Safe Operating Area durch diese Gerade begrenzt wird: f [MHz] = 10MHz +
(Vcc-2,7V)*10MHz/1,8V = Vcc*10MHz/1,8V-5MHz.
D.h. bei Vcc=4,1V wäre 17,7MHz ok.
Der Takt wird vom 8MHz-RC-Oszillator abgeleitet, der über OSCCAL justiert werden kann. Die PLL verachtfacht den Takt, der für die CPU geviertelt wird. Ist OSCCAL.7=0, so wird der Wert in OSCCAL.[6:0] auf ein schmäleres Frequenzband angewendet, als bei OSCCAL.7=1. Im Code werden so unterschiedliche Korrekturen verwendet:
if (OSCCAL >= 128) { OSCCAL += 7; } else { OSCCAL += 5; }
In Arduino ist die CPU-Frequenz durch F_CPU definiert, beim Kompilieren ist das der Parameter -DF_CPU=16500000L. Je nach eingestelltem Board sind 16,5MHz, 16Mhz, 8MHz und 1MHz kompilierbar.
Unter Arduino läuft der ATtiny85 mit 16,5MHz. Ich habe diese Stromaufnahme gemessen, wobei an PB4 und PB3 zusätzlich ein 1k5 PullUp mit 22Ω und eine 3,6V-Z-Diode ist, und der 5V-Spannngsregler mit gemessen ist:
Vcc=3,3V | Vcc=4,1V | Vcc=5V | Bemerkung | |
---|---|---|---|---|
normal | 7,19mA | 9,67mA | 13,18mA | |
+ ADC disable | 6,95mA | 9,38mA | 12,85ma | |
+ 4x input pullup HIGH | 7,06mA | 9,66mA | 12,97mA | PB3 nur 2,65V @Vcc=3,3V PB4 nur 1,93V @Vcc=3,3V |
+ 4x input pullup LOW | 6,95mA | 12,85mA | ||
+ 4x output HIGH | 8,67mA | 15,61mA | 28,86mA | 1,5k PullUp an PB3 |
+ 4x output LOW | 6,96mA | 9,26mA | 12,35mA | |
Sleep Power Down | 2,336mA | 3,336mA | 5,725mA | |
+ ADC disable | 2,134mA | 3,106mA | 5,500mA | |
ohne den Spannungsregler, nur Pullup und Z-Dioden:
Vcc=3,3V | Vcc=4,1V | Vcc=5V | Bemerkung | |
---|---|---|---|---|
normal | ||||
+ ADC disable | ||||
+ 4x input pullup HIGH | 5,41mA | 7,40mA | 10,05mA | PB3 nur 2,65V @Vcc=3,3V PB4 nur 1,93V @Vcc=3,3V |
+ 4x input pullup LOW | ||||
+ 4x output HIGH | 1,5k PullUp an PB3 | |||
+ 4x output LOW | ||||
Sleep Power Down | ||||
+ ADC disable | 0,474mA | 0,869mA | 1,387mA | |
//Für eine Lösung, bei der auf USB verzichtet werden kann, sollten die 22Ω-Widerstände und der Spannungsregler entfernt werden.
Wird der Watchdog nicht genutzt, sollte er im Programm-Init deaktiviert werden, falls er durch irgendwelche Umstände eingeschaltet worden war:
Eigenschaften:
Benachrichtigung von
Nachrichten über
ATtiny85 <-> SIM800L
ATtiny85 <-> extern
Falls die Eingänge nicht ausreichen, kann der Alarmeingang auch über den RESET realisiert werden. Über das MCUSR (MCU Status Register) ist die Reset-Ursache ablesbar. Der Watchdog kann einen Reset auslösen.
Da der ATtiny85 nur 512 Byte RAM besitzt, könnte die Aufzeichnung der Batteriespannung zweistufig erfolgen: erst den RAM füllen, dann als EMail-Anhang in den SIM800 übertragen
Betrieb mit 4V, d.h. max. Takt 17,2MHz.
Ablauf
Alarm-Interrupt
Sleep
PowerOn ohne SIM:
PowerOn mit SIM-PIN
PowerOn ohne SIM-PIN
PowerOn ohne SIM-PIN, Roaming abgelehnt
bei +CFUN=1 -> 4, wenn vorher eingebucht
bei +CFUN=4 -> 1: (wenn CPIN gesetzt)
bei +CFUN=1 -> 0: (wenn eingebucht)
bei +CFUN=0 -> 1: (wenn SIM-PIN)
bei +CFUN=0 -> 1: (ohne SIM-PIN)
bei +CPIN=1234: (kann auch während CFUN=4 gesetzt werden)
Die Zeitzone (+8) ist in Viertelstunden, ',1' bedeutet "+1 Stunde Sommerzeit".
Beispiele:
Damit CCLK die richtige Zeit bekommt, muss (beim Einbuchen ins Netz) AT+CLTS=1 sein.
Kann auch bei CFUN=0 und CFUN=4 ausgeführt werden.
Beispiele (nach einem *PSUTTZ: 2023,8,14,8,28,41,"+8",1):
Aufwachen
Verarbeitung von unsolicited result codes
SIM800 - speicherbare User-Konfig durch AT&W
Auto-Save-Konfig
UART zum SIM 800
Konfiguration zum Speichern mit AT&W:
Diverses
Befehl | Bedeutung | Anmerkung |
---|---|---|
AT+FSCREATE=C:\User\USERTrustRSA.der | Create certificate file on FS. | |
AT+FSWRITE=C:\User\USERTrustRSA.der,0,1506,10 | Write file at pos. 0; 1506 bytes within 10 seconds | |
[1506 Datenbytes] | File data bytes | The CRT-files to be imported must be binary encoded |
Befehl | Bedeutung | Anmerkung |
---|---|---|
AT+CGATT=1 | GPRS Verbindung aufbauen | |
AT+SAPBR=3,1,"CONTYPE","GPRS" | Profile 1: Set Type of Internet connection: GPRS (default) | |
AT+SAPBR=3,1,"APN","internet.eplus.de" | Profile 1: Set APN | |
AT+SAPBR=3,1,"USER","eplus" | Profile 1: Set User | |
AT+SAPBR=3,1,"PWD","gprs" | Profile 1: Set Password | |
AT+SAPBR=3,1,"CONTYPE","GPRS";+SAPBR=3,1,"APN","internet" | ||
AT+SAPBR=1,1 | Open bearer Profile 1 | kann auch mit AT+CFUN=1;+SAPBR=1,1 |
AT+SAPBR=2,1 | Query bearer status Profile 1 | |
AT+SAPBR=4,1 | Show bearer parameters Profile 1 |
"SIM800 series support SSL2.0, SSL3.0, TLS1.0"
Befehl | Bedeutung | Anmerkung |
---|---|---|
AT+EMAILSSL=1 | Set EMAIL begin encrypt transmission with encryption port (1) | |
AT+SSLOPT=0,0 | SSL Option: 0,0 = need server cert. (0,0 default) | |
AT+SSLOPT=1,0 | SSL Option: 1,0 = no client auth. (1,0 default) | |
AT+SSLSETROOT=C:\User\USERTrustRSA.der,1506 | Import SSL Root Certificate File, 1506 bytes | The files to be imported must be binary encoded |
AT+EMAILCID=1 | Set EMAIL Use bear profile 1 (refer to AT+SAPBR) | |
AT+EMAILTO=30 | Set EMAIL timeout (30s default) | |
AT+SMTPSRV="mail.arcor.de",587 | Set SMTP server address, port is omitted, means use the default ports: 465 | |
AT+SMTPAUTH=1,"christian.enders@arcor.de","*******" | Set user name and password | |
AT+SMTPFROM="christian.enders@arcor.de","SIM800L" | Set sender address and name | |
AT+SMTPSUB="Info" | Set the subject (max. 512 Zeichen) | |
AT+SMTPRCPT=0,0,"christian.enders@arcor.de","Christian Enders" | Set the recipient ('0'=To:, Index='0') | |
AT+SMTPBODY=19 | Set the body length (max. 4096 Zeichen) | |
This is a new Email | ||
AT+SMTPFILE=1,"test.txt",0 | Anhang ankündigen | |
AT+EMAILSSL=1;+SMTPSRV="smtp.yandex.com";+SMTPAUTH=1,"christian.enders@yandex.com","jjslofeuzldplame";+SMTPFROM="christian.enders@yandex.com","SIM800L";+SMTPRCPT=0,0,"christian.enders@arcor.de","Christian
Enders";+SMTPSUB="Info";+SMTPBODY=19 This is Email No. 4 AT+SMTPSRV?;+SMTPAUTH?;+SMTPFROM?;+SMTPRCPT?;+SMTPSUB?;+SMTPBODY? |
||
AT+SMTPSEND | Send the Email: OK kommt gleich, wait for '+SMTPSEND: 1' 61: Network error - GPRS-Verbindung ok? (AT+SAPBR=1,1 => AT+SAPBR=2,1 ; AT+CGREG? |
|
AT+SMTPFT=100 | Falls Anhang: nach der Aufforderung +SMTPFT: 1,1360 zum Upload von max. 1360 Bytes, den Upload von z.B. 100 Bytes starten, Ende des Uploads durch Upload-Länge 0: AT+SMTPFT=0 |
Anruf aufbauen: ATD+49721386727; (mit Semikolon!)
Bei AT+COLP=0 (default) wird gleich nach dem Wählen mit OK betätigt; bei COLP=1 kommt kein OK und die UART ist blockiert solange der Ruf aktiv ist.
Bei besetzt kommt nach ein paar Sekunden BUSY, auch wenn's weggedrückt wird (und nicht auf AB umgeleitet wird).
Der Anrufstatus kann automatisch gemeldet werden: AT+CLCC=1, oder manuell abgefragt werden: AT+CLCC (Liste mit allen aktiven Gesprächen):
Es wird die Basisstations-ID über den SIMCOM-Server abgefragt. Der Default-Server "lbs-simcom.com:3001" ist kostenlos (8/2023).
Die Anzahl der Zugriffe wird über die IMEI gezählt und kann abgefragt werden: AT+CLBS=3,1
Man kann bei einem Fehler mithelfen die Position zu korrigieren: Report cell information of positioning and really longitude and latitude to server.
Könnte z.B. auch per SMS abgefragt werden:
Um die Versorgung auf 4,1V umzustellen habe ich den Spannungsregler abgeklemmt. Der Bootloader wurde durch upgrade-t85_entry_on_reset_activePullup_fastExit.hex ersetzt. Der Upload läuft nun so ab:
Cycles | if(item == (RxBuf+RXBUF_SIZE-1)) item = RxBuf; else item++; |
Cycles | item++; if(item == (RxBuf+RXBUF_SIZE)) item = RxBuf; |
Cycles | item++; |
1 | 20 e0 ldi r18, 0x00 ; hi8(BUF_END) | 2 | 01 96 adiw r24, 0x01 | ||
1 | 86 3f cpi r24, 0xF6 ; lo8(BUF_END) | 1 | 20 e0 ldi r18, 0x00 ; hi8(BUF_END+1) | ||
1 | 92 07 cpc r25, r18 | 1 | 87 3f cpi r24, 0xF7 ; lo8(BUF_END+1) | ||
1/2 | 11 f0 breq .+4 | 1 | 92 07 cpc r25, r18 | ||
2/- | 01 96 adiw r24, 0x01 | 1/2 | 11 f4 brne .+4 ; EndIf | ||
2/- | 02 c0 rjmp .+4 ; EndIf | 1/- | 87 e7 ldi r24, 0x77 ; lo8(BUF_START) | ||
-/1 | IsIf: 87 e7 ldi r24, 0x77 ; lo8(BUF_START) |
1/- | 90 e0 ldi r25, 0x00 ; hi8(BUF_START) | ||
-/1 | 90 e0 ldi r25, 0x00 ; hi8(BUF_START) | 8/7 | EndIf: | ||
8/7 | EndIf: | ||||