-         

Ergebnis 1 bis 9 von 9

Thema: Mega8 serielle Schnittstelle

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136

    Mega8 serielle Schnittstelle

    Anzeige

    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:
    Code:
    $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.

    Code:
    $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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    42
    Beiträge
    33
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136
    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?

    Code:
    $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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    42
    Beiträge
    33
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136
    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!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    42
    Beiträge
    33
    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 (naja ) und die zeitspanne in der er mist raufschrauben.




    mfg

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    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

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    42
    Beiträge
    33
    hmmm? Wieso nicht durchführbar ? Mit nem anständigen Quartz kann er doch ruhig zeit verschlampen.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •