Digispark ATTiny85

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)

A/D-Wandler

Channel Port Arduino
ADC0 P5 analogRead(0)
ADC1 P2 analogRead(1)
ADC2 P4 analogRead(2)
ADC3 P3 analogRead(3)
ADC4 Temp analogRead(4)

PWM

Bootloader

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:

ArduinoISP

SPI-Programmer mit gemoddetem CH341A

Assemblercode

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"

Fuses

Die Fuses werden über SPI bearbeitet:

Zur Berechnung der Fuses gibt es Fuse-Calculatoren:

avrdude

Beschreibung der Argumente: https://www.nongnu.org/avrdude/user-manual/avrdude_4.html

Clock Output

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:

Externe Interrupts

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.

Sleep

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:

CPU-Takt

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.

Stromaufnahme

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.

Watchdog

Wird der Watchdog nicht genutzt, sollte er im Programm-Init deaktiviert werden, falls er durch irgendwelche Umstände eingeschaltet worden war:

  1. MCUSR &= ~(1<<WDRF); // Watchdog-Reset-Flag zurücksetzen
  2. WDTCR |= (1<<WDCE) | (1<<WDE); // Watchdog aktivieren
  3. WDTCR = 0; // Watchdog deaktivieren

Eigenschaften:

Signal- und Spannungsüberwachung

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)

Zeitinformation +CTZV, *PSUTTZ und +DST

Die Zeitzone (+8) ist in Viertelstunden, ',1' bedeutet "+1 Stunde Sommerzeit".

Beispiele:

Zeitinformation AT+CCLK?

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

unnötig, weil nicht unterstützt: SMTP-Server-Root-Zertifikat installieren

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

GPRS-Verbindung (Konfig benötigt SIM-PIN)

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  

EMail mit TLS senden

"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 - nur klingeln und auflegen

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):

Standort mittels SIMCOM bestimmen - GPRS muss aufgebaut sein

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:

Upload nach Vreg-Mod

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:

  1. falls im Gerätemanager der Digispark Booloader zu sehen ist: ATTiny vom USB getrennen und wieder anschließen (-> unbekanntes Gerät)
  2. Upload starten: launcher -cdigispark --timeout 60 -Uflash:w:C:\Users\CHRIST~1\AppData\Local\Temp\arduino_build_875396/GSMAlarm.ino.hex:i
  3. Reset am ATTiny auslösen -> Upload startet

Code-Optimierungen

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:        
           

Erstellt 01.07.2021, zuletzt geändert 29.08.2023 16:28:51, Zugriffszähler Besuche. © Christian Enders