Danke!!
dann werde ich mir mal die BASCOM-Hilfe anschauen und es mal probieren.
jon
Druckbare Version
Danke!!
dann werde ich mir mal die BASCOM-Hilfe anschauen und es mal probieren.
jon
Ich habe schon die BASCOM-Hilfe durchforstet, aber nichts gefunden :(
Jetzt bin ich aber auf die Idee gekommen über ein Low-Signal dem ATMega zu "sagen", dass was empfangen werden soll und er erst in eine Schleife geht, wenn das Signal wirklich anliegt.
Aber da ich diese Signalleitung auch zum Resetten (<--mit doppeltem "t"???) verwende, habe ich die Frage, wie lange ich den Reset-Pin auf low ziehen kann, ohne dass er resettet.
Ich werde gleich aber auch nochmal ins DB schauen :)
jon
für den empfang mit der software uart kann ich nur die version mit dem interrupt empfehlen... bin gerade an nem projekt indem ich es verwende...
hier ein kleiner auszug aus meinem code must ihn halt noch abändern für deinen prozi... wichtig ist einfach dass der port für den empfang an einem interrupt pin hängt... bei mir wird der anfang der zu empfangenen daten mit einer 1 erkannt...
Code:Open "Comb.6:9600,8,n,1" For Input As #2
Config Int0 = Falling
On Int0 Int0_isr
Enable Int0
Enable Interrupts
do
loop
Int0_isr:
Temp = Inkey(#2)
If Temp = 1 Then
Temp = 0
Servo1 = Waitkey(#2)
Servo2 = Waitkey(#2)
Speed = Waitkey(#2)
End If
Return
gruss bluesmash
Das blöde ist nur, dass bei mir schon alle Interrupt-Ports belegt sind :(
Sonst hätte ich es auch erst so versucht.
jon
was hast du denn alles an den interrupts? ev. könnte man ja 2 zusammenfassen... indem man 2 auf einen interrupt legt und zusätzlich die beiden signale auf je einen normalen port legt, dann in der interrupt routine die beiden ports abfragen und schauen welcher interrupt ausgelöst hat....
gruss bluesmash
@Jon
Bluesmash hat den richtigen Weg beschrieben. Du solltest es in einer ISR abfangen.
Da Du auch mit einem ATMEGA8 arbeitest, verweise ich mal zur Info auf mein ATMEGA8-Projekt mit Software + Hardware UART:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=26041
Ich verwende keine Interrupts. Ich habe nur noch einen Pin frei, den habe ich jetzt mit dieser Signal-Leitung belegt.
Weshalb ich kein Interrupt verwenden kann:
1.Kein Pin frei, der Interrupt hat
2.Kann ich nicht immer einen Interrupt vertragen, da ich auch die Signale abfragen muss, die von der Fernbedienung kommen. Und wenn er mich dann bei Vorwärtsfahren unterbricht, dann kann ich nicht bremsen. Kommt also eine Kannte, habe ich ein Problem.
Ich könnte zwar den Bot stoppen, aber das möchte ich nicht.
Ich werde es jetzt so mal probieren und schauen, was herauskommt.
jon
Hallo Jon,Zitat:
Zitat von Jon
wie schon Bluesmash andeutete - es war nur ein guter Rat.
Wenn Du Dich mit Interrupts beschäftigst, wirst Du erkennen, das eine ISR der einzige Weg ist, um diese Unterbrechungen von INKEY/WAITKEY/GETRC5 o.ä. zu vermeiden.
Was benutzt Du für eine Fernsteuerung?
Wirklich? Der Atmega8 besitzt mind. 4 Eingänge um Level-Interrupts zu erzeugen.Zitat:
Zitat von Jon
Eingänge: INT0, INT1, Analog Comparator ANA_COMP und noch den Timer/Counter1 Capture Event ICP1 (TIFR.ICF1)
Diese O:)Zitat:
Zitat von -tomas-
Der muss aber auch mit 4µCs und über Funk kommunizieren. Da ist kaum weiterer Platz...Zitat:
Zitat von -tomas-
Aber ich habe es jetzt geschafft. Ich habe es hinbekommen, wenn ich mit dem Prog fertig bin, kann ich es mal auf meine Seite stellen.
jon
Zitat:
Zitat von Bluesmash
Hi,
wie wird das von dem anderen Controller angesteuert? Also wie sendest du die Bytes? Ich hab folgenden Code für den Servocontroller:
Und das is der Code von dem Controller, der dem Servocontroller die "Befehle" gibt:Code:$regfile = "attiny2313.dat"
$crystal = 8000000
Waitms 100
Config Servos = 4 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Servo4 = Portd.6 , Reload = 10
Config Portb = Output
Config Portd.6 = Output
Config Int0 = Falling
On Int0 Int0_isr
Enable Int0
Enable Interrupts
Servo(1) = 100
Servo(2) = 100
Servo(3) = 100
Servo(4) = 100
Dim Temp As Byte
Dim New As Bit
Dim Servo_num As Byte
Dim Servo_pos As Byte
Open "Comd.2:9600,8,n,1" For Input As #2
Do
If New = 1 Then
Servo(Servo_num) = Servo_pos
New = 0
End If
Loop
Int0_isr:
Temp = Inkey(#2)
If Temp = 1 Then
Temp = 0
Servo_num = Waitkey(#2)
Servo_pos = Waitkey(#2)
New = 1
End If
Return
Dadurch sollte der Servo sich immer vor und zurückdrehn. Allerdings bewegt er sich keinen Millimeter. Es muss am Soft-UART liegen, wenn ich den Servo direkt ansteuer gehts. Ich denke mal dass die "Print"-Befehle nicht in Ordnung sind.Code:$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Waitms 100
Do
Print 1
Print 1
Print 170
Wait 2
Print 1
Print 1
Print 70
Wait 2
Loop
End
Kann mir jemand helfen?
MfG