Hi
Du hast echt Glück, dass ich ohnehin nix besseres vorhatte.
Hier ist ein (hoffentlich ausreichend kommentiertes) Beispiel
Code:
$regfile = "2313def.dat" 'AT90S2313 natürlich muss hier die Definitionsdatei für deinen AVR hin
$crystal = 8000000 'Und hier deine Taktfrequenz
'Konstanten
Const Startbyte = 00000001
Const Stopbyte = 00000011
'Variablen
Dim Zaehl As Byte : Dim Fehler As Bit : Dim Temp As Byte
Dim Zaehl2 As Byte : Dim Temp2 As Byte 'Nur zum Zaehlen im Interrupt - nicht woanders benutzen, da es plötzlich auf 7 wechseln könnte. Temp2 ändert sich auch(höchstwahrscheinlich) bei jedem Interrupt
Dim Gelesen As Byte : Dim Zusenden As Byte 'In Gelesen steht nach dem Empfang (also automatisch, wenn ein Signal am Port anlag) der empfangene Wert. In Zusenden musst du vor dem Aufrufen der Senderoutine den Wert reinschreiben, den du senden willst.
Enable Int0
Config Int0 = Falling
On Int0 Onint0 Nosave
Enable Interrupts
Ddrb.0 = 0 'PortB.0 auf Eingang - Die Ports sind willkürlich gewählt
Ddrb.1 = 1 'PortB.1 auf Ausgang
Do
Zusenden = 54 'Sendet erstmal einfach jede Sekunde 54
Gosub Senden
Waitms 760 'Wartet den Rest der Sekunde, den das Senden nicht gedauert hat
Loop
Onint0: 'löst das erste mal aus, wenn das Startbyte vorbei ist(dafür würde auch ein Bit genügen. Ist schlecht für die Fehlerkorrektur.)
push SREG
Waitms 5 'jetzt sind wir in der Mitte des ersten Datenbits...
Gosub Bytelesen 'und lesen die anderen
Temp = Gelesen 'Hier sind wir in der Mitte des ersten Bit des Stopbytes...
Gosub Bytelesen ' ...und lesen es
If Gelesen <> Stopbyte Then Fehler = 1 Else Fehler = 0 'Für ein Minimun an Fehlererkennung kannst du in Fehler abfragen, ob das Stopbyte korrekt empfangen wurde
Gelesen = Temp 'In Gelesen steht jetzt der empfangene Wert
waitms 5 'Damit die fallende Flanke am Ende des Stopbytes nicht als Anfang eines neuen Bytes verstanden wird (da der Empfang während eines Interupts stattfindet, löst der so nicht nochmal aus).
pop SREG
Return
Bytelesen:
For Zaehl2 = 0 To 7
Gelesen.zaehl2 = Portb.1
Waitms 10
Next
Return
Senden:
Temp = Zusenden 'Zu sendendes Byte sichern, da die Variable Zusenden mehrfach benutzt wird
Zusenden = Startbyte
Gosub Bytesenden
Zusenden = Temp
Gosub Bytesenden
Zusenden = Stopbyte
Gosub Bytesenden
Return
Bytesenden:
For Zaehl = 0 To 7
Portb.0 = Zusenden.zaehl
Waitms 10
Next
End
Zu erwähnen wäre folgendes:
1. Ich hab's nicht getestet (zwei AVRs damit bespielen, verbinden und irgendwie ausprobieren, ob das richtige angekommen ist, war mir dann doch zu aufwändig). Im Prinzip sollte das halt gehen.
2. Ich hab' keine Ahnung, wie lange die einzelnen Bascom-Befehle brauchen. Zum Zeitbedarf der Warteschleifen kommt also noch der der Befehle hinzu(der Unterschied zwischen deren Zeitbedarf beim Senden und Empfangen ist hoffentlich bei einem Byte <5ms, sonst verpasst der ein Bit).
3. Senden und Empfangen "gleichzeitig"(also auf einem AVR) ist nicht ohne weiteres möglich, da die Empfangsroutine das Senden unterbricht (und so lange Pause macht, dass das Gesendete unverständlich wird). Dann müsstest du während dessen die Interrupts ausmachen und irgendwie dafür sorgen, dass die AVRs sich mit dem Zeitfenster abwechseln (oder statt Warteschleifen Timer nehmen, was aber erstens recht umständlich ist und zweitens wohl nur in ASM genau geht).
Die Routinen sind also nur zur Anschauung im gleichen Programm untergebracht.
4. Ich weis auch nicht, welche Register Bascom einfach so benutzt(für die Schleifen), die nicht gesichert werden(siehe nosave). Wenn der Rest deiner Programmausführung beim Empfangen nicht richtig geht, lass es weg(und wenn es dann zu lange dauert, mach die ersten "waitms 5" kürzer.).
Lesezeichen