Hi
Du hast echt Glück, dass ich ohnehin nix besseres vorhatte.
Hier ist ein (hoffentlich ausreichend kommentiertes) Beispiel
Zu erwähnen wäre folgendes: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
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.).







Zitieren

Lesezeichen