-
Ich habe noch nie in Bascom programmiert und habe mir gerade mal nur den Sendecode angeschaut.
Das kann so nicht funktionieren.
Erstens: Wie ich schon zweimal erwähnt habe. Die Sende LED darf nicht dauernd leuchten. Du musst sie mit 36 kHz modulieren - sonst liefert dein TSOP Empfänger IMMER nur 0 zurück.
In den Sende routinen musst du nicht 500 ms warten (was sogar falsch ist) und du musst auch nicht dien PORTb.0 wieder auf Null zurück setzen.
Zur Modulation.
Code:
$regfile = "m8def.dat"
$crystal = 12000000
Dim Daten As Byte
Dim A As Integer
Config Portb = Output
Mainloop:
Daten = 170
For A = 1 To 8
If Daten.0 = 1 Then
Gosub Send1
Else
Gosub Send0
End If
rotate Daten , Right , 1
Waitms 500
Next A
Goto Mainloop
Send1:
Send = 1
Goto Mainloop
Send0:
Send = 0
Goto Mainloop
Timer [der alle 1/ 72 000 s aufgerufen wird]:
if send = 1 Then
if toggle = 0 Then
toggle = 1
PORTb.0 = 1
else
toggle = 0
PORTb.0 = 0
end if
else
Portb.0 = 0
end if
So etwa sollte die Senderoutine aussehen.
Ich schau mir gleich noch die Empfangsroutine an.
Grüße
Flite
EDIT: Ach ja: eine Startbedingung fehlt natürlich auch. Sonst empfängt dein Empfänger nachher immer nur müll ...
-
Ähnliches gilt auch für deine Empfangsroutine:
Code:
$regfile = "m8def.dat"
$crystal = 12000000
Dim A As Integer
Dim Rxdaten As Byte
Dim Zustand As Integer
Config Portd = Input
Config Portb = Output
Zustand = Pind.2 // WAS IST DAS ?!?
Mainloop:
StartLoop:
If NOT Startbedingung = True Then
Goto StartLoop
' Auf Startbedinung warten
For A = 1 To 8
If PINb.0 = 0 Then
Rxdaten.0 = 0
Else
Rxdaten.1 = 1
End If
rotate Rxdaten , Left , 1
Waitms 500
Next A
PORTC = Rxdaten 'Ausgabe des gesendeten Bytes
Goto Mainloop
So könnte es schon eher funktinieren.
-
Das funktioniert auch nicht :-(
Was mache ich nur falsch...
Hab die Codes, so wie sie sind, je in einen AVR eingeflashed.
Aber es geht nicht ;-(
MfG,
SHadowPhoenix
...Was könnte ich nur falsch machen...
-
Was hast du jetzt als Startbedinung genommen?
Das sie so nicht gehen ist ja klar.
Wann soll die Variable Startbedinung auch auf True gesetzt werden?
Hast du den Timer richtig initialisiert?
Was für einen AVR verwendest du denn?
Grüße Flite
-
Startbedingung habe ich noch keine, sorry aber ich weiß nicht, wie ich das programmieren soll.
Ich benutze einen AVR ATmega8.
Der Timer sollte richtig initialisiert sein, habe den Code ja abgeschrieben.
MfG,
ShadowPhoenix
-
Also zum senden Startbedingung:
Vielleicht so:
Code:
send = 1
waitms 10
send = 0
Zum empfangen der Startbedingung:
Code:
startLoop:
if PORTB.0 = 1 Then
waitms(52)
if NOT PORTB.0 = 0 Then
goto startLoop
end if
else
goto startLoop
end if
Ich kann den Code hier nicht ausprobieren.
Versuch ihn zu verstehen und dann reinzukopieren (natürlich an die richtige Stelle).
Zur Initialisierung des Timers.
Kannst du mir mal posten, wie du den Timer initialisert hast?
Grüße
Flite
-
Den Timer initialisieren hast du doch eh schon gepostet:
Timer [der alle 1/ 72 000 s aufgerufen wird]:
if send = 1 Then
if toggle = 0 Then
toggle = 1
PORTb.0 = 1
else
toggle = 0
PORTb.0 = 0
end if
else
Portb.0 = 0
end if
So habe ich das auch hingeschrieben!
MfG,
ShadowPhoenix
-
Timer [der alle 1/ 72 000 s aufgerufen wird]:
SO HAST DU DAS DA REIN GESCHRIEBEN ?!?!?!
Dat geht logischerweise nicht.
Ich weiß nicht wie man den Timer in BASCOM initialisiert. Aber dazu gibts doch im Netz bestimmt genug Infos (oder auch in der Bedienungsanleitung von Bascom).
Du brauchst eine Funktion, die alle 1 / 72 000 s aufgerufen wird um dein Signal zu modulieren. Diese kann man mit dem Timer machen.
Und das obere Beispiel hast du so rein kopiert und kompiliert. Kann mir irgendwie nicht vorstellen, dass der so einen Schwachsinn überhaupt kompiliert.
Vielleicht solltest du dir erstmal ein wenig die Grundlagen aneignen?
Versuch doch mal eine LED mittels des Timers zum blinken zu kriegen, so dass die jede Sekunde einmal und einmal aus geht ...
Das soll dich nicht von dem Projekt hier abhalten (das ist nämlich echt einfach zu realisieren). Aber wenigstens die Grundfunktionen solltest du beherrschen, weil ich ohne je Bascom programmiert zu haben dir hier kein völlig funktinierendes Proghramm reinstellen kann.
In Codevision C könnte ich dir so ein prgramm schreiben, aber das ist ja nicht Sinn der Sache. Dabei lernst du ja nichts.
grüße
Flite
-
Oh sorry, diese Zeile:
Timer [der alle 1/ 72 000 s aufgerufen wird]:
hatte ich natürlich nicht eingefügt. !
Flite, es ist nicht so, dass ich die Grundlagen des AVR's nicht beherrsche.
Eine Led per Taster zum blinken zum bringen ist wohl das einfachste.
7Segment Anzeigen usw. habe ich auch schon angesteuert.
Eh nicht schwer, nur das mit den Bytes usw. kapiere ich leider nicht!
Da bin ich totaler Anfänger, aber da ich nun so etwas für den ADDLink zum fernsteuern meines Roboterfahrzeuges brauche, muss ich langsam
anfangen, mich mit diesen Funktionen vertraut zu machen :-O
MfG,
ShadowPhoenix
PS: Bitte tu mir einen gefallen:
Schreibe mir bitte den kompletten Sendecode sowie den kompletten Empfängercode auf (exklusive der Timer funktion, da blättere ich noch einmal nach, ok?)
Danke, weil dann flashe ich die AVR's mal damit und dann mal sehen !
-
So ich habs jetzt mal zusammenkopiert, wie ich mir das vorstelle.
Ich glaube jedoch nicht, dass das jetzt aufs erste Mal funktioniert - vielleicht sieht ja jemand anderes den Thread hier noch und kann schnell mal drüber schauen.
Aber probieren kann mans ja:
Der Sendecode:
Code:
$regfile = "m8def.dat"
$crystal = 12000000
Dim Daten As Byte
Dim A As Integer
Dim Send as Byte
Dim toggle as Byte
Config Portb = Output
Mainloop:
Waitms 1000
Daten = 170
'Sende Startbedingung
send = 1
waitms 10
send = 0
For A = 1 To 8
If Daten.0 = 1 Then
Send = 1
Else
Send = 0
End If
rotate Daten , Right , 1
Waitms 500
Next A
Goto Mainloop
[[[[ DIESE FUNKTION MUSS ALLE 1 / 72000 s AUFGERUFEN WERDEN ]]]]]
if send = 1 Then
if toggle = 0 Then
toggle = 1
PORTb.0 = 1
else
toggle = 0
PORTb.0 = 0
end if
else
Portb.0 = 0
end if
Und der Empfangscode:
Code:
$regfile = "m8def.dat"
$crystal = 12000000
Dim A As Integer
Dim Rxdaten As Byte
Dim Zustand As Integer
Config Portd = Input
Config Portb = Output
Mainloop:
startLoop:
if PORTB.0 = 1 Then
waitms(52)
if NOT PORTB.0 = 0 Then
goto startLoop
end if
else
goto startLoop
end if
waitms 10
For A = 1 To 8
If PINb.0 = 0 Then
Rxdaten.0 = 0
Else
Rxdaten.0 = 1
End If
rotate Rxdaten , Left , 1
Waitms 500
Next A
PORTD = Rxdaten 'Ausgabe des gesendeten Bytes
Goto Mainloop
Der Sendecode sendet alle 5050 ms die Befehle.
Dabei dauert ein Bit 500 ms und die Startbedinung 50 ms.
Vor jedem senden wird 1000 ms gewartet.
Das empfangene Byte wird an PORT D angelegt. D.h. den musst du noch auf Ausgang schalten (weiß ich nicht wie ...).
Grüße
Flite