Seite 1 von 1

Daten loggen mit der STI 100 - Platine

Verfasst: Mi 1. Feb 2012, 17:41
von Heinrichs
Will man größere Datenmengen loggen, reicht das EEPROM des Attiny nicht aus. Hier kann die Platine STI 100 von ELV (Artikel-Nr.: 68-07 59 50) helfen: Mit ihrer Hilfe können nämlich Daten vom Mikrocontroller auf einem handelsüblichen USB-Stick gespeichert werden.

sti100_an_attiny_Platine2_klein.jpg
sti100_an_attiny_Platine2_klein.jpg (71.53 KiB) 13468 mal betrachtet

Die Handhabung ist relativ einfach: Die STI 100 - Platine wird mitsamt dem USB-Stick wie in der Abbildung gezeigt an die Attiny-Platine angeschlossen; die drei Jumper werden in Richtung Steckerleiste gesetzt. So wird die STI 100 - Platine für die Kommunikation über die UART-Schnittstelle (ohne Handshake) konfiguriert. Standardmäßig ist die serielle Schnittstelle des STI 100 eingestellt auf 9600 Baud, 1 Startbit, 1 Stoppbit, kein Paritätsbit. Diese Einstellung hat auch unser Attiny, wenn in BASCOM der Befehl $baud = 9600 eingegeben wird.

Die STI 100 - Platine arbeitet zwar mit 3,3 V - Signalen, kommt aber auch ohne Pegelwandler mit den 5 V - Signalen des Attiny zurecht.

Die Befehle zum Umgang mit dem USB-Stick ähneln den DOS-Kommandos. Hier eine kleine Auswahl:

befehlstabelle.jpg
Befehlstabelle (Auswahl)
befehlstabelle.jpg (97.71 KiB) 13468 mal betrachtet

Die Befehle können auf zwei verschiedene Arten an die STI 100 - Platine gegeben werden: Einmal über ASCII-Befehle und einmal über hexadezimale Befehle. Standardmäßig ist der STI 100 auf ASCII-Befehle eingestellt. Eine Umstellung erfolgt mit dem SCS-Befehl. Die hexadezimalen Befehle sparen etwas Speicherplatz und sind im Umgang mit dem Mikrocontroller etwas einfacher (So vermeiden sie Probleme mit dem Literalzeichen “\”.); aber sie sind weniger gut einprägsam. Deswegen soll in unserem einführenden Beispiel der ASCII-Befehlssatz benutzt werden.

Unser Mikrocontroller soll 10 Temperaturwerte über einen LM75-Baustein messen und auf dem USB-Stick in einer Datei namens tempera5.txt im Stammverzeichnis abspeichern. Zunächst laden wir (bei abgetrenntem STI 100; dazu +5V-Verbindung kappen) das Programm auf den Attiny. Dann schalten wir die Attiny-Platine aus, stellen die +5V-Verbindung zur STI 100-Platine wieder her und schalten die Attiny-Platine wieder an. Die STI 100 - Platine sendet im Rahmen des Initialisierungsvorgangs mehrere Zeichenketten. Dies dauert manchmal einige Sekunden. Wenn alles in Ordnung ist, sendet sie als letzte Zeichenkette das Prompt-Zeichen “D:\>”. (Einer meiner USB-Sticks bereitete Probleme: In diesem Fall war die letzte Rückmeldung “No Disk”. Solche Meldungen ergaben sich auch bei anderen USB-Sticks, als die Batteriespannung zu niedrig war.)

Unser Attiny-Programm überprüft bei der Initialisierung ankommenden Zeichenketten: Erst wenn das letzte Zeichen der Zeichenkette ein “>” ist, dann wird die Datei “tempera5.txt” geöffnet und das eigentliche Loggen kann beginnen. Die Einzelheiten entnimmt man dem beigefügten Sourcecode.

Hier nur drei Bemerkungen:

1. Die STI 100 - Befehle werden mit einem <cr> (Ascii-Code 13) abgeschlossen. Der BASCOM-Befehl print schließt gewöhnlich die zu sendende Zeichenkette mit einem <cr><lf> ab. Das zusätzliche LineFeed-Zeichen würde die Kommunikation stören. Deswegen werden alle Print-Befehle mit einem Semikolon beendet; dadurch werden die <cr><lf>-Steuerzeichen unterdrückt. Die <cr>-Zeichen werden dann über printbin cr gesendet.

2. Beim WRF-Befehl muss die Anzahl der Bytes unserer Temperaturangabe stehen. Bei uns sind das 3 Bytes: 2 Bytes für den Temperaturwert selbst, der mit dem Print-Befehl als Zeichenkette gesendet wird, und 1 Byte für das Leerzeichen, welches hier als Abgrenzungszeichen (Delimiter) eingesetzt wird. Die STI 100 - Platine erwartet für diese Angabe eine Zahl aus 4 Bytes; die 3 führenden Bytes sind dann 0 und das letzte ist 3.

3. Wenn man der Datei die Extension “csv” gibt, dann kann sie auch mit Tabellenkalkulationsprogrammen (z. B. Open Office.org Calc) weiter bearbeitet werden. Für diesen Fall empfiehlt sich als Delimiter ein Semikolon (->Zeile> oder ein <cr>-Zeichen (->Spalte).

Code: Alles auswählen

' Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' plus I2C-Temperatursensor LM75 plus STI1000
' LEDs an PortB.0 (rot), PortB.1 (gelb)
' 10 Temperaturen werden über STI100 auf USB-Stick geschrieben
' STI100 über TTL-COM/USART (verträgt 5 V)
' Speichern der Daten im ASCII-Format durch Leerzeichen getrennt
'
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                             	'Attiny2313
$crystal = 4000000                                          	'4 MHz
$baud = 9600

'******************* Deklarationen ************************

Dim Temperatur As Byte
Dim Adresse As Byte
Dim Dateiname As String * 20
Dim Antwort As String * 20
Dim I As Byte
Const Prompt = ">"                                        	'Der vollständige Prompt D:\> ist wegen des \-Zeichens problematisch
Const Cr = 13                                              	 'CR-Steuerzeichen
Declare Sub Messung
Declare Sub Usb_init
Declare Sub Wert_speichern
Declare Sub Schluss

'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Config Scl = Portb.7                                        	'Konfigurieren von I2C
Config Sda = Portb.5

Adresse = 153                                              	 'Adresse des LM75 (kann auch anders sein!)
Dateiname = "tempera5.txt"                      	 'keine überlangen Dateinamen

'**********************************************************
'******************** Hauptprogramm ***********************

Call Usb_init
If Antwort = Prompt Then
  Portb.0 = 1                                               	'rote LED an: jetzt USB-Stick nicht entfernen
  For I = 1 To 10
    Portb.1 = 1                                             	'gelbe Led blinkt während Messung
    Call Messung
    Call Wert_speichern
    Portb.1 = 0
    Wait 2
  Next I
  Call Schluss
  Portb.0 = 0                                               	'rote LED aus; USB-Stick kann entfernt werden
End If
End

'**********************************************************
'******************* Unterprogramme ***********************

Sub Messung
  I2cstart
  I2cwbyte Adresse
  I2crbyte Temperatur , Nack                  	'Kein Acknowledge
  I2cstop
  Waitms 300
End Sub

Sub Usb_init
  Do
    Input Antwort Noecho
    Antwort = Right(antwort , 1)                   	'wegen Problemen mit \ nur auf > testen
  Loop Until Antwort = Prompt                     	'vierte Antwort sollte Prompt sein

  Portb.2 = 1                                               	'USB-Stick eingeloggt
  Waitms 100
  Portb.2 = 0
  Wait 1

  Printbin Cr                                               	'Puffer bei sti100 leeren; denn: ggf. sendet Attiny am Anfang ein sinnloses Zeichen. Kann entfernt werden, wenn STI100 nach dem Attiny eingeschaltet wird.
  Input Antwort Noecho

  Print "OPW " ; Dateiname;                         	'semikolon verhindert CR LF
  Printbin Cr                                               	'CarriageReturn ohne LineFeed
  Input Antwort Noecho
  Antwort = Right(antwort , 1)
  If Antwort = Prompt Then                           	'Datei geöffnet
    Portb.1 = 1
    Waitms 100
    Portb.1 = 0
  End If
End Sub

Sub Wert_speichern
  Print "WRF " ;
  Printbin 0
  Printbin 0
  Printbin 0
  Printbin 3                                              	'2 Ziffern und 1 Leerzeichen-> 3 Bytes
  Printbin Cr
  Print Temperatur ; " ";
  Input Antwort Noecho
End Sub

Sub Schluss
  Print "CLF " ; Dateiname;
  Printbin Cr
  Input Antwort Noecho
End Sub