Hallo,
also der Empfang läuft über Interrupt:
Der Empfänger arbeitet etwa so:
On Urxc Onrxd
Onrxd:
E_byte = Udr
Select Case E_byte
Case 35 : E_flag = 1 '"#" = Slave wird gesendet
Case 58 : E_flag = 3 '":" =
Case 13 : E_flag = 4 '"13 / ENTER" = Empfang komplett
Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte)
If E_flag = 2 Then Parameter = Parameter + Chr(e_byte)
If E_flag = 3 Then Wert = Wert + Chr(e_byte)
End Select
Return
Später werden alle Daten in einen String geschoben und dieser wird auf die Karte geschrieben.
Wie meinst du dass, wie die Daten ankommen?
Es wird ca 11 mal pro Sekunde mit einem Printbefehl gesendet.
Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X"
Das ;;X am Ende ist, weil ich manchmal 1-2 Zeichen verlohren habe
Code:
'SENDER RS232
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 38400 'Baudrate der UART
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
'Ddrb = &B10000001 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
'Ddrd = &B11100000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Ausgang; 0 als Eingang (Freigabe)
'Portc = &B11111111 'PC0...PC7 auf High setzen
'-------------------------------------------------------------------------------
'Konfiguration LCD
Config Pinb.2 = Output
Pinb.2 = 0 '= Read / Write
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portd.4 'neues LCD mit Quarz
Cursor Off Noblink ' Cursor aus
'-------------------------------------------------------------------------------
'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'-------------------------------------------------------------------------------
'Timer
Config Timer1 = Timer , Prescale = 1024
Timer1 = 36736 'Überlauf alle 2 Sekunden
Enable Timer1
Enable Interrupts
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
'-------------------------------------------------------------------------------
' Variablen
Dim Ani_1 As Byte 'Zähler für startannimation
Dim Ende As Byte 'zum Animation beenden
Dim Analog1 As Word '=0-1023 vom Analogeingang (für Strommessung)
Dim Strom1 As Single 'Stromwert 0
Dim Strom11 As Byte 'Ergebnis Strom1
Dim Strom11_old As Word 'LCD aktualisieren, wenn Wert sich geändert hat
Dim Max0 As Byte 'warte zeit für max1wert
Dim Max1 As Byte 'MAX Strom1
Dim Max2 As Byte 'MAX_MAX Strom1
Dim Analog5 As Word '=0-1023 vom Analogeingang (für Spannungsmessung)
Dim Anzahl_rs232 As Word 'Abstand RS232 senden
Dim Spannung1 As Single
Dim Spannung2 As Word 'für RS232
Dim Stelle0 As Byte 'um die richtige Stelle anzuwählen - VORZEICHEN
Dim Stelle1 As Byte 'um die richtige Stelle anzuwählen - Strom aktuell
Dim Stelle2 As Byte 'um die richtige Stelle anzuwählen - Strom MAX1
Dim Stelle3 As Byte 'um die richtige Stelle anzuwählen - Strom MAX2
Dim Stelle_v As Byte 'um die richtige Stelle anzuwählen - Analogeingang 5
Dim Vorzeichen As String * 1 'Vorzeichen + / -
Dim Lcd_z As Word 'LCD Zähler zum Anzeige aktualisieren
Dim Zyklus As Long 'Anzahl der Do...Loop Durchgänge in 2 Sekunden
'-------------------------------------------------------------------------------
'Do - Looproutiene:
'-------------------------------------------------------------------------------
Start Adc 'Starte analog Messung
Max1 = 0 'Max Stromspeicher1 löschen
Do
' _______________________________________________________________
'| ___________________________________________________________ |
'| |Stromberechnung: | |
'| | | |
'| |Analogeingang - Vref also 512 Stufen = Stromwert in Stufen | |
'| |Stromwert in Stufen * 1,5625 = Stromwert in A | |
'| |___________________________________________________________| |
'|_______________________________________________________________|
'Analogeingänge Auslesen:
Analog1 = Getadc(1) 'Wert aus Analogeingang laden (Stromsensor)
Analog5 = Getadc(5) 'Wert aus Analogeingang laden (Spannung)
Strom1 = Analog1 - 510 'von 512 auf 510 geändert, weil 0A bei 510 liegt...Messtoleranz...
If Strom1 < 0 Then 'wenn Strom negativ
Strom1 = Strom1 * -1
Vorzeichen = "-"
Else
Vorzeichen = " "
End If
Strom1 = Strom1 * 1.5625 'Strom1 = Strom in Amperé
If Strom1 > 0 Then 'damit bei negativen Strömen kein Blödsinn angezeigt wird!!
Strom11 = Round(strom1)
Else
Strom11 = 0
End If
'Max1 Strom speichern
If Strom11 > Max1 Then
Max1 = Strom11
End If
'Max2 Strom speichern
If Strom11 > Max2 Then
Max2 = Strom11
End If
'Spannung errechnen
Spannung1 = Analog5 * 45.1319648093842 'Widerstände gemessen 9,9k & 81,5k-> 46,17V
Spannung2 = Round(spannung1)
Spannung1 = Spannung1 / 1000 'für LCD anpassen
'Maxspeicher zurücksetzen
If Max0 > 4 Then
Max0 = 0
Max2 = 0
End If
'-------------------------------------------------------------------------------
'Stellen für LCD anwählen
'-------------------------------------------------------------------------------
'richtige Stelle anwählen!
If Strom11 < 10 Then
Stelle1 = 4
Stelle0 = 3 'Anzeige für negatives Vorzeichen
Else
Stelle1 = 3
Stelle0 = 2 'Anzeige für negatives Vorzeichen
End If
If Strom11 > 99 Then
Stelle1 = 2
Stelle0 = 1 'Anzeige für negatives Vorzeichen
End If
'richtige Stelle anwählen!
If Max1 < 10 Then
Stelle2 = 3 '14 für großes LCD
Else
Stelle2 = 2 '13
End If
If Max1 > 99 Then
Stelle2 = 1 '12
End If
'richtige Stelle anwählen!
If Max2 < 10 Then
Stelle3 = 7
Else
Stelle3 = 6
End If
If Max2 > 99 Then
Stelle3 = 5
End If
'richtige Stelle anwählen!
If Analog5 < 10 Then
Stelle_v = 8
Else
Stelle_v = 7
End If
If Analog5 > 99 Then
Stelle_v = 6
End If
If Analog5 > 999 Then
Stelle_v = 5
End If
'LCD aufrufen
Incr Lcd_z
If Lcd_z > 300 Then '300 = 5 RS232 Werte pro Sekunde empfangen!!!
Lcd_z = 0
Gosub Lcd_klein
End If
'_______________________________________________________________________________
'_______________________________________________________________________________
'RS232 senden
Incr Anzahl_rs232 'Variable für Zeitabstand
If Anzahl_rs232 > 90 Then 'ca. 11 Werteausgaben pro Sekunde
Anzahl_rs232 = 0
Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X"
End If
Incr Zyklus
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Sprungmarken:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Ontimer1overflow:
Timer1 = 36736
Max1 = 0
Incr Max0
'Print Zyklus
'Zyklus = 0
Return
'-------------------------------------------------------------------------------
Lcd_klein:
Cls
'Locate 1 , Stelle0
'Lcd Vorzeichen
Locate 1 , Stelle0
Lcd Strom11 ; "A"
Locate 1 , 5
Lcd Fusing(spannung1 , "#.&") ; "V"
'Lcd Spannung3
'Locate 1 , Stelle_v
'Lcd Analog5
Locate 2 , Stelle2
Lcd Max1 ; "A"
Locate 2 , Stelle3
Lcd Max2 ; "A"
Return
'===============================================================================
'Pinbelegung µC Strommessung LEM 200-P
'===============================================================================
' AT MEGA 8
' +---U---+
' Reset PC6 +1 28+ PC5
' PD0 +2 27+ PC4
' PD1 +3 26+ PC3
' PD2 +4 25+ PC2
' PD3 +5 24+ PC1
' PD4 +6 23+ PC0 Analogeingang0
' Vcc +7--- 22+ GND | / Reset |
' GND +8 |-21+ AREF | / GND |
' RS PB6 +9 |-20+ AVCC | / +5V |
' E PB7 +10 19+ PB5 Taster5 | / SCK |
' / LCD / DB4 PD5 +11 18+ PB4 Taster4 | / MISO |
' / LCD / DB5 PD6 +12 17+ PB3 Taster3 | / MOSI |
' / LCD / DB6 PD7 +13 16+ PB2 Taster2 ___________
' / LCD / DB7 PB0 +14 15+ PB1 Taster1
' +-------+
'===============================================================================
'Pinbelegung AM LCD
'===============================================================================
'Pin 1: GND
'Pin 2: +5V
'Pin 3: Kontrast (0-5V)
'Pin 4: RS -> AVR
'Pin 5: R/W -> GND (read/write mode, nur writen)
'Pin 6: E -> AVR
'Pin 7-10: -> GND
'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
Lesezeichen