und hier noch das komplette Programm vom Empfänger:


Code:
'Empfänger

$regfile = "M644def.dat"
$crystal = 20000000

$hwstack = 250
$swstack = 250
$framesize = 450

$baud = 38400


'-------------------------------------------------------------------------------
'Ein- Ausgänge:

Ddra = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PA7-0
'Ddrb = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B00000000                                           '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B11000000                                           '1 Ausgang, 0 Eingang = Pin PD7-0
Config Pinb.4 = Output                                      'CS
Config Pinb.6 = Input                                       'MISO / DO



$include "config_mmc.bas"
$include "config_avr-dos.bas"

'-------------------------------------------------------------------------------
'ALIAS
J1 Alias Pinc.2                                             'Schalter logging
J2 Alias Pinc.1
J3 Alias Pinc.0                                             'LogZeit
Led1 Alias Portd.6                                          'unten links
Led2 Alias Portd.7                                          'unten rechts

'-------------------------------------------------------------------------------
Print "POWER ON..."
Led2 = 1                                                    'LED rechts

'-------------------------------------------------------------------------------
'Für RS232:
On Urxc Onrxd                                               'Interrupt-Routine setzen
Enable Urxc                                                 'Interrupt URXC einschalten
Enable Interrupts                                           'Interrupts global zulassen
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc                                                   'Starte analog Messung

'-------------------------------------------------------------------------------
'EEPROM Variablen:
Dim Lognummer_ee As Eram Word                               'Anzahl der Loggings
Dim Lognummer As Word

'-------------------------------------------------------------------------------
'Timer1 = 16 Bit 10 mal pro Sek @ 20MHz
Config Timer1 = Timer , Prescale = 64                       'Teiler 1/8/64/256/1024
On Timer1 Ontimer1overflow                                  'Unteprogramm aufrufen
Const Timer1vorgabe = 34286                                 '34286=10x/sek 49911=5x/sek
Timer1 = Timer1vorgabe

'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Variablen:

'SD
Dim Tmpbyte As Byte                                         'zum initialisieren
Dim Btemp1 As Byte                                          'zum initialisieren

'Analogeingänge
Dim K0 As Integer                                           'Spannung Empfänger
Dim K1 As Integer                                           'Spannung Akku
Dim K2 As Integer                                           'Strom Akku  Shunt
Dim K3 As Integer                                           'Strom Akku Hallsensor
Dim K4 As Integer                                           'RES
Dim K5 As Integer                                           'RES
Dim K6 As Integer                                           'RES
Dim K7 As Integer                                           'Temp.


Dim Anzahl As Long                                          'Zähler für schreiben
Dim Anzahl_str As String * 6

Dim Zu_schreiben As String * 70
Dim Rec As Bit                                              'wird von J1 oder Empfänger(Pulsein) gesetzt
Dim Rec_z As Word                                           'wird von Timer 1 hochgezählt 5*/sec
Dim Rec_sd As Bit                                           'Datei öffnen schließen
Dim Led As Word
Dim Led_wert As Word                                        'Wert für blinken
Dim Logzeit As Word                                         'Einstellung wie oft loggen
Dim Loginfo As String * 20                                  'Text in txt Datei wie oft/sec geloggt wurde

'RC-Empfänger auswerten
Dim Pulsbreite1 As Word                                     'Knüppelstellung Knüppel 1
Dim Pulsbreite11 As String * 3
Dim Pulsbreite2 As Word                                     'Knüppelstellung Knüppel 2
Dim Pulsbreite22 As String * 3

'Drehzahlmessung
Dim T01 As Byte                                             'Wert Timer0
Dim T02 As Integer                                          'Wert Timer0 Anzahl Überläufe
Dim Drehzahl_t01 As Byte
Dim Drehzahl_t02 As Integer
Dim Drehzahl As Single                                      'Drehzahl umgerechnet
Dim Drehzahl1 As Word                                       'gerundeter Wert
Dim Drehzahl_s As String * 6                                'Drehzahl für Ausgabe

'RS232 Empfang
Dim Slave As String * 3
Dim Parameter As String * 10
Dim Wert As String * 10
Dim S1_rs As String * 8                                     'von der RS 232 Schnittstelle
Dim E_byte As Byte , E_flag As Byte


Dim Zyklus As Word                                          'incr bei jeder Do...Loop!
'-------------------------------------------------------------------------------
'Variablen belegen:

Lognummer = Lognummer_ee                                    'Wert von EEPROM auslesen
Print "lognummer: " ; Lognummer



Waitms 500
'_______________________________________________________________________________
'LogZeit Festlegen
If J1 = 1 Then                                              'Aufnahme Jumper gesteckt, bevor Spannung da ist -> Fehler2
Goto Fehler1
End If



Print "START SD-Test..."
'_______________________________________________________________________________
'Init MMC/SD Card

Tmpbyte = Driveinit()
    Print "Init: " ; Str(tmpbyte)
    Print "Trying to read File system..."
    Btemp1 = Initfilesystem(1)                              ' Partition 1
    Print "Btemp1: " ; Btemp1 ; " 0=ok"

If Btemp1 <> 0 Then                                         'Wenn Fehler
Print "Error: " ; Btemp1 ; " beim  Initialisieren des Dateisystems"
Waitms 500
Print "SD - FEHLER"
Goto Fehler2
Else
Print "SD-Card OK"
End If


'_______________________________________________________________________________
'LogZeit Festlegen
If J3 = 0 Then
Logzeit = 1                                                 '10 mal pro Sek. loggen
Loginfo = " (Log 10x / sek)"                                'Text in txt Datei
Else
Logzeit = 10                                                '1 mal pro Sek. loggen
Loginfo = " (Log 1x / sek)"                                 'Text in txt Datei
End If

Print Loginfo


''Enable Int0                                                 'Drehzahlmessung 1 aktiv
Enable Interrupts                                           'Interrupts global
''Enable Timer0                                               'timer0 einschalten
Enable Timer1                                               'timer1 einschalten


'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Led1 = 1                                                    'LED unten links an
Led2 = 0                                                    'LED unten rechts aus
Do
'Incr Led                                                    'led hochzählen

Toggle Led1

'Aufnahme
Rec = J1                                                    'Jumper zum Aufzeichnen




'Steuerung LED2(rechts) für "logging ON/OFF"
If J1 = 1 And Rec_sd = 1 Then
   Led2 = 1                                                 'LED unten rechts an                                         'langsam
Else
   Led2 = 0                                                 'LED unten rechts aus
End If


'-------------------------------------------------------------------------------
'Datei öffnen und schließen
If Rec = 1 And Rec_sd = 0 Then
Open "LOG.txt" For Append As #1
Print #1 , "#Lognummer: " ; Lognummer ; Loginfo
Print #1 , "#Nr.  ;K0 RC mV;K1 BATT mV;K2 SHUNT A;K3;K7 Temp;Drehzahl;A&mV_RS"
Incr Lognummer                                              'LogNummer hochzählen und
Lognummer_ee = Lognummer                                    'in EEPROM übertragen
Rec_sd = 1
End If
If Rec = 0 And Rec_sd = 1 Then
Close #1
Print "SD geschlossen"
Rec_sd = 0
End If



'===============================================================================
'Eingänge Auswerten:

'Analogkanäle einlesen
K0 = Getadc(0)                                              'Wert aus Analogeingang laden
K1 = Getadc(1)                                              'Wert aus Analogeingang laden


'ENDE Eingänge auswerten


'RS232 Empfang
If E_flag = 4 Then                                          'Empfangsstring komplett
  If Slave = "S1" Then                                      'wenn Daten für Slave1

               S1_rs = Wert
               'Print "S1: " ; S1_rs
       'Select Case Parameter

        '       Case "Ampere" : Ampere_rs = Wert             ' Print "#S1,Strom:" ; Wert

         '      'Case "Volt" : Volt_rs = Wert                 ' Print "#S1,Strom:" ; Wert


         '      Case Else : Print "Err. RS232 Empfang"                      'wenn nicht definiert dann Err. anzeigen

       'End Select


  End If

  'Daten auf jedenfall löschen
  Slave = ""                                                'Slave löschen
  'Parameter = ""                                            'Parameter löschen
  Wert = ""                                                 'Wert löschen
  E_flag = 0                                                'Empfang neu setzen
End If
'===============================================================================



'Logging
If Rec = 1 And Rec_z => Logzeit Then
Incr Anzahl
Anzahl_str = Str(anzahl)
Anzahl_str = Format(anzahl_str , "000000")

Zu_schreiben = Anzahl_str + ";" + Str(k0) + ";" + Str(k1) + ";" + S1_rs
S1_rs = "?;?"                                               'wenn keine Daten mehr kommen!!!
Gosub Sd_schreiben

'Print Rec_z                                                 'Kontrolle: wenn > 1 dann Zykluszeit zu groß d.h. kein Loggen 10x/sec möglich!
Rec_z = 0                                                   'Variable von Timer zurücksetzen
End If

'Datensatznummer zurücksetzen
If J1 = 0 Then                                              'Schalter logging = 0
Anzahl = 0
End If

'Zyklus
Incr Zyklus

Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop       ENDE  -  ENDE  -  ENDE  -  ENDE  -  ENDE  - ENDE
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------




'_______________________________________________________________________________
'Daten auf SD - Card schreiben:

Sd_schreiben:
'Datei öffnen / erstellen wenn nicht vorhanden!
'Open "LOG.txt" For Append As #1
Print #1 , Zu_schreiben                                     'Variable auf SD schreiben
''Print Zu_schreiben                                          'Variable auf COM / PC anzeigen

'Close #1

Return

'_______________________________________________________________________________
'bei J1 Fehler1
Led1 = 0                                                    'Do...Loop Led aus
Fehler1:
Print "Fehler1 J1 gesteckt Aufnahme vor Spannung!!!"
Led2 = 1                                                    'Grüne LED blinken für FEHLER
Waitms 1000
Led2 = 0                                                    'Grüne LED blinken für FEHLER
Waitms 1000
Goto Fehler1

'_______________________________________________________________________________
'bei SD Fehler2

Led1 = 0                                                    'Do...Loop Led aus
Fehler2:
Print "Fehler2 - SD nicht gefunden!!!"
Led2 = 1                                                    'Grüne LED blinken für FEHLER
Waitms 500
Led2 = 0                                                    'Grüne LED blinken für FEHLER
Waitms 500
Goto Fehler2

'_______________________________________________________________________________
Ontimer1overflow:                                           '10 mal pro Sekunde
Timer1 = Timer1vorgabe
Incr Rec_z

''Print Zyklus
Zyklus = 0

Return


'RS232 - Empfang - Strom von LEM 400
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