PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega8 serielle Schnittstelle



Florian.
23.05.2005, 15:33
Hallo,

seit ein paar Tagen kann ich vom AVR zum PC über die serielle Schnittstelle nicht mehr senden. Ich verwende den Mega8 und als Pegelwandler den MAX232. Als ich zum ersten Mal den Print Befehl benutzt habe, hat er auf anhieb funktioniert und ich konnte im Terminalprogramm die vom Avr gesendeten Zeichen empfangen. Als ich es ein weiteres Mal versuchen wollte habe ich es nicht mehr geschafft. In Bascom habe ich im Menü alles nach der Anleitung von www.myavr.de (habe das sisy myavr Board) konfiguriert.
Mein Code sah bei beiden Versuchen wie folgt aus:

$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Do
Print "12"
Loop
end

Ich habe keine Einstellungen diesbezüglich verändert. Ich habe es auch schon mit anderen PCs versucht.
Kann ich irgendwie überprüfen (an den Pins?) ob der Avr überhaupt die Zeichen sendet und ob der Max232 seine Arbeit auch richtig tut? Ich wüsste zwar nicht wieso er aufeinmal nicht mehr funktionieren sollte, aber ich kann mir fast nichts anderes mehr vorstellen.

Ich habe gleich noch eine zweite Frage, die vielleicht nicht ganz zur Überschrift passt, allerdings möchte ich auch nicht noch einen Thread eröffnen. Der Hintergrund weshalb ich überhaupt etwas vom avr zum PC senden möchte ist folgender:
Ich habe ein Programm zum auswerten eines CNY70 geschrieben. Das Programm soll die Impulse (ein Impuls pro Umdrehung) pro Sekunde messen und das ganze dann in Umdrehungen/Minute umrechnen. Also eine Drehzahlmessung. Weil ich noch kein LCD habe um die Drehzahl auszugeben, und das Programm richtig zu testen, dachte ich mir, ich schicke den Wert einfach an den PC.
Vielleicht kann von Euch mal jemand kurz den Code überfliegen ob das so theoretisch überhaupt funktionieren kann.



$regfile = "m8def.dat"
$crystal = 3686400
Dim Zaehlerstand As Byte
Dim A As Integer
Dim Drehzahl As Integer
Const Timervorgabe = 61936
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer
Timer1 = Timervorgabe
Enable Timer1
Enable Interrupts

Do
Drehzahl = A * 60
Print "Drehzahl=" ; Drehzahl
Loop

End

Timer:
Timer1 = Timervorgabe
Zaehlerstand = Zaehlerstand + 1
A = Zaehlerstand
Zaehlerstand = 0
Return


Im Simulator habe ich es nicht geschafft den Int0 zu beeinflussen, so dass ich das ganze Programm im Simulator testen könnte.

Ich Danke Euch jetzt schon mal


Florian

Getaco
23.05.2005, 15:48
Ich denke dein Program wird so nicht laufen. Du must
Enable Int0 und on INT0 mach_was einbauen. In "mach_was" würde ich einen zähler um eins bei jedem int0 hochzählen und in der Timer routine den zähler mal 60 nehmen und mit print ausspucken.

Int0 kans du nur im Simulator ansprechen wenn er im program aktiviert worden ist.

Mit der schnittstelle ist schon komisch aber ich hatte änliche probleme die sind aber ,seit ich eine "richtige platine" benutze, wie weggeblasen. Nur bei einem avr hat's mir die ttl-rs dahingeraft :(

mfg

Florian.
23.05.2005, 16:26
Ich habe den Code auch teilweise aus anderen Beiträgen abgekupfert, darum denke ich, dass ich damit nicht ganz daneben liege. Der int0 muss natürlich rein, habe ich vergessen...
Ich habe den Code jetzt nochmal ein wenig verändert, weiss aber selbst, dass es so noch nicht ganz funktionieren kann. :). Wie schaffe ich es jetzt, dass genau nach einer Sekunde das Zählen aufhört und ich den Wert anschliessend verarbeiten und ausgeben kann?



$regfile = "m8def.dat"
$crystal = 3686400
Dim Zaehlerstand As Byte
Dim A As Integer
Dim Drehzahl As Integer
Const Timervorgabe = 61936
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Enable Int0
on int0 Zaehlen
On Timer1 Mytimer
Timer1 = Timervorgabe
Enable Timer1


Do
Loop

Zaehlen:
Zaehlerstand = Zaehlerstand + 1


Mytimer:
A = Zaehlerstand
Drehzahl = A * 60
Print Drehzahl
Timer1 = Timervorgabe
Zaehlerstand = 0
Return

End

Getaco
23.05.2005, 16:35
hmmm..sieht doch recht gut aus dein progi. Müste meiner ansicht nach doch laufen.Ich weiss zwar nicht warum du nach einer sekunde aufhören wils aber dann setz einfach ein disable interrupts hin dann hören alle dein Int's auf. Oder schalte einfach den Timer ab mit Stop timer.

mfg

Florian.
23.05.2005, 17:01
also ich versuche jetzt mal das Programm in Worte zu fassen...
bei jeder Flanke (weiss noch nicht ob fallend oder steigend) spring ich mit int0 in das Unterprogramm Zaehlen. Darin zähle ich die Variable einfach hoch. Jetzt sollte das ganze ja nach 1er Sekunde ausgewertet und ausgegeben werden. Dann soll die Prozedur wieder von vorne beginnen. Es muss ja genau eine Sekunde sein, weil die Drehzahl ja Impulse/Zeit sind...also muss ich genau wissen wieviele Impulse in einer bestimmten Zeiteinheit ankommen um dann die Drehzahl berechnen zu können.

Meinst du diese Funktion ist durch den oben genannten Code gegeben? Ich kanns noch gar nicht glauben :)

Das mit dem int0 im Simulator klappt jedoch noch nicht...hab ich da noch was vergessen?

Schonmal Danke für deine Hilfe!

Getaco
23.05.2005, 17:14
ach hab noch vergessen da fehlt auch ein Return nach deiner Zeahler routine und vor deiner timer routine.

ja denke schon, dass der Code die aufgabe erfüllt. Nuja du must die Drehzahl ja nicht unbedingt in der Timer Routine ausgeben, die Variabel "Drehzahl" ist ja immer und überall verfügbar.Du kannst ja in deine Do..Loop "massenhaft" code reintun(der prozessor scheint mir etwas zu schade um nur jede sekunde was auszuspucken :) ) und dann irgendwann, bevor die do wieder loop, nen Print "Drehzahl ist : " ; Drehzal ; " 1/min".
Das mit dem simulator ist so ne sache, ich weis nicht wie es bei den andern bzw bei dir ist, aber bei mir läuft der nicht REAL Time, d.h. der tickert mit nem halbe Herz ;) herum. Ist eine sehr feine sache zu überprüfen und zu messen wie lange dauert mein program von zeile a nach b, aber fürn rest -> reinbrennen und testen. Wenn deine schaltung oder aufbau noch nicht komplett ist kans du ja einen taster als Interrupt geber benutzen :-k (naja :) ) und die zeitspanne in der er mist raufschrauben.




mfg

pebisoft
23.05.2005, 17:31
in bascom so nicht durchführbar, bascom schlampert zeitlich sehr viel mit den code.
solche routinen sind in winavr-c besser aufgehoben.
mit bascom kann man nur daumensprungverfahren-routinen durchführen.
mfg pebisoft

Getaco
23.05.2005, 17:40
hmmm? Wieso nicht durchführbar ? Mit nem anständigen Quartz kann er doch ruhig zeit verschlampen.

Florian.
23.05.2005, 17:40
hmm...also wenn man mal die Suchfunktion benutzt und nach Drehzahl im Bascom Forum sucht, dann findet man einige Threads in denen das angeblich mit Bascom zu laufen scheint...
meinst du, dass diese Aufgabe mit Bascom auf keine Art zu lösen ist?
Habe allerdings keinen Schimmer was Daumensprungverfahrenroutinen sind :)