- fchao-Sinus-Wechselrichter AliExpress         
Seite 4 von 53 ErsteErste ... 2345614 ... LetzteLetzte
Ergebnis 31 bis 40 von 524

Thema: Tutorial für alle Assembler-Anfänger _

  1. #31
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Anzeige

    LiFePo4 Akku selber bauen - Video
    *assemblernachwuchs muss gefördert werden ;o)*
    Deswegen versuche ich dem Thomas zu helfen, Du hast recht,
    es macht Spaß, wenn jemand versucht die AVR's richtig zu verstehen

    @Thomas,

    Der Stromfluß bei meiner Diode ist von dem Pluspol (VCC) über die Diode zum PIN,
    deswegen Leuchtet Sie wenn Pin LOW ist.
    Wenn das andersrum wäre (also von Pin über Diode zum Minuspol) dann müßte
    Der Pin High sein, um die Diode zum leuchten zu bringen.

    Wie gesagt, es wird meistens so gemacht.

    Gruß Sebastian

  2. #32
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Deswegen versuche ich dem Thomas zu helfen, Du hast recht,
    es macht Spaß, wenn jemand versucht die AVR's richtig zu verstehen
    Genau! ;o)
    Danke, dass Du mir unter die Arme greifst, ich habe in den Ferien gerade einiges zu tun und bin etwas weniger online!

  3. #33
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ahh, der Moderator höchstpersönlich
    Ich finds nett, dass ich hier so freundlich aufgenommen wurde. Besonderen Dank fällt natürlich an Sebastian, der sich besonders um mich bemüht und sicher auch mal die Augen verdrehen muss

    Danke auch Florian, dass ich mich an dich wenden darf.
    Ich gehe auch grad den Code mit dem Timer durch, also damit das Prellen des Tasters unterdrückt wird.
    Aber was ich nicht ganz verstehe. Er führt doch nur einmal am Anfang beim Starten des Programm das hier aus
    Code:
       ;;Timer Register werden belegt 
       ;;Ich nehme hier den Timer 0 
       ldi tmp,(1<<CS02) | (1<<CS00)   ;prescaller ist 1024 
       out TCCR0,tmp   ;Register TCCR0 ist für den Prescaller zuständig 
       ldi tmp,(1<<TOIE0);Hier werden Interrupts nach Timer0 Überlauf eingeschaltet 
       out TIMSK,tmp   ;Register TIMSK ist dafür zuständig 
       ldi tmp,time   ;Hier wird der Timer vorgeladen und zwar mit 255-254 
       out TCNT0,tmp   ; Er läuft 254 mal durch bevor ein Interrupt auftritt 
       sei      ;mein Lieblingsfehler, na was den Interrupts allgemein zulassen
    Und dann springt er ja zur loop und wartet bis ich den Taster drücke und springt dann in den Interrupt zeitum. Und dort wird nichts mehr von timer oder was anderes erwähnt. Also woher weiß das Programm dann, dass er warten soll?
    Wenn ich das richtig verstanden habe, ist das sone Art Standardcode, den man oben beim "reset" einfügt, sodass dann bei jedem Interrupt eine bestimmte Zeit gewartet wird?
    Und so wie ich das sehe, sind die Register TCCR0, TIMSK, TCNT0 festgelegte Register für Timer-Sachen?
    Und was hat das 255-254 genau zu bedeuten? Ok, er läuft 254 mal eine Schleife ab, bevor ein Interrupt durchgeführt wird, aber wieso dann die 255?
    Fragen über Fragen, aber der Mensch ist ja neugierig

    Gruß
    Thomas

    [edit]
    Ok, danke Sebastion, ich denk ich hab das mit dem VCC soweit verstanden, muss ich dann nochmal genauer schauen, wie das bei mir ist. Solang ich den Code kommentiere, damit ich ihn noch verstehe, ist das denk ich in Ordnung.

  4. #34
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Ahh, der Moderator höchstpersönlich
    *g*
    Lang, lang, lang ist's her ...
    da fing ich auch mal so an! ;o)
    Ich kenne die Probleme, die man hat und wie verloren man sich ohne jemanden, der einem hilft, fühlt!
    Viel Erfolg noch!

  5. #35
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Ich glaube wirklich, daß es ein Tutorial wird....

    OK, mit Interrupts hast Du noch keine Erfahrungen, naja, aber jetzt.

    Und dann springt er ja zur loop
    Das habe ich schonmal gesagt, er springt nicht sondern, nachden die letzte Zeile in reset abgearbeitet wurde, geht er zur nächsten, die einfach nur loop heiß

    und wartet bis ich den Taster drücke und springt dann in den Interrupt zeitum.
    Nein so geht es nicht ab.

    loop ist ja meine Hauptschleife, dort arbeitet das Programm schön Zeile für Zeile ab.
    Den Timer habe ich auf etwa 26 mS eingestellt, das heißt wenn 26 mS um sind,
    wird ein Interrupt ausgelöst und dann springt er in zeitum: rein.
    Dort wird nachgeschaut, ob Taster Low ist, wenn nicht, verläßt er zeitum: wieder und
    geht an die Stelle im Programm zurück, wo er durch den Interrupt unterbrochen wurde.

    Das Programm wartet nicht auf die Taste !!!
    Es ist ihm egal ob Sich da was tut oder nicht, es macht munter seine Arbeit(naja in meinem Beispiel springt nur zwischen loop und rjmp loop hin und her) es wird einfach nur alle 26mS abgebrochen.

    Wenn ich das richtig verstanden habe, ist das sone Art Standardcode, den man oben beim "reset" einfügt
    Naja Standard, weiß nicht es sind immer die gleichen Register, die vorbelegt werden müssen.

    sodass dann bei jedem Interrupt eine bestimmte Zeit gewartet wird?
    Es wird nicht gewartet, jetzt müßtest Du das verstehen(sehe oben)

    TCCR0, TIMSK, TCNT0
    Ja, davon gibt es noch mehr(der Mega hat 3 Timer), sehe link von mir

    Und was hat das 255-254 genau zu bedeuten
    Der Timer läuft bei 255 über und verursacht einen Timer Overflow Interrupt(zeitum: sehe
    .org OVF0addr
    rjmp zeitum) oder DattenBlatt
    ich habe mir ausgerechnet, daß er genau 254 mal hochzählen muß, bevor er überläuft,
    dann ist es einfacher zu schreiben 255-254)

    klaro?

    Gruß Sebastian

  6. #36
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Axo, also alle 26ms (oder was man halt einstellt) ruft er ein Interrupt auf bzw. löst eines aus? Und was passiert, wenn man mehrere Interrupts hat? Ist ja gut möglich bei größeren Programmen. Ruft er dann eines nach dem anderen auf?
    Was ich ja echt erstaunlich finde ist, dass 26 ms ausreichen. Ist das Prellen des Tasters von so kurzer Dauer? Also das heißt ich drück den Taster und bevor die 26ms um sind, prellt der Taster gar nicht mehr?
    ich habe mir ausgerechnet, daß er genau 254 mal hochzählen muß
    Gibt es dafür auch eine Formel? Oder läuft der Timer auf jedem Chip gleich schnell durch? Denn man kennt ja das Problem vom delay, dass dieser bei schnelleren CPUs schneller durchläuft und sich somit eine Figur in einem Spiel dann auch schneller bewegt (wenn man die Move-Funktion mithilfe von delay programmiert).

    Gruß
    Thomas

  7. #37
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Nochwas,
    Der Timer läuft ganz nebenbei, hat also nichts mit dem Hauptprogramm zu tun,
    das einzigste, was er macht, er unterbricht das Hauptprogramm immer, wenn er übergelaufen ist und Springt zu meiner zeitum Funktion bis er auf reti stößt.

    Das stimmt auch nicht so ganz, weil der zu Adresse $009 springt , die in m8def.inc mit
    .equ OVF0addr=$009 definiert ist.

    Und wie er dann den Weg nach zeitum: findet, darfst Du selber rausfinden.

    Gruß Sebastian

  8. #38
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    klar ist das mit den Zeiten von Quarz abhängig.

    Schau, irgendwo habe ich den Prescaller auf 1024 eingestellt,
    Suche jetzt im Dattenblatt nach dem Register TCCR0 und schaue Dir mal an was man damit anstellen kann.

    Prescaller 1024 heißt, daß der haupttakt(also der Takt vom Quartz) 1024 mal hmm, ich sagmal auftretten muß, bevor mein Timer um eins erhöht wird.

    Die zweite einstellsache ist der Wert des Taimers ich habe hier 255-254 also lade ich Ihn mit 1.
    alle 1024 Takte wird er um eins erhöht, bis er bei 255 ankommt, und wenn er dann noch einmal +1 macht, dann läuft er über, weil 1 Byte höchstens 255 beinhalten kann 11111111

    Dann Macht er erst den Interrupt.
    Jetzt mußt Du rechenen mein quartz ist 10 Mhz / 1024 / 254 ergibt etwa 38,5 Hz also 26 mS

    Mehrere Interrupts, ja es gibt beim Mega8 14 glaube ich aus dem Kopf.
    wenn 2 gleichzeitig auftreten, was eine Glücksache ist aber nicht unmöglich gewinnt derjenige der höher in der liste steht, schaue m8def.inc
    ganz unten stehen sie alle der erste ist der wichtigste, und dann geht es ab nach unten.

    Dann hat der, der tiefer in der Liste steht verloren und geht leer aus

    Gruß Sebastian


    Nachtrag; ich habe 19 Interrupts gezählt, mei Kopf ist doch nicht mehr der beste....

  9. #39
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ahh, das klingt ja schon alles viel verständlicher

    Und wie er dann den Weg nach zeitum: findet, darfst Du selber rausfinden.
    Weil unter "org OVF0addr" das hier steht --> "rjmp zeitum" Also springt er dann zu zeitum :muh: *g*

    Aber wie weiß er denn, dass er nach der Zeit zu "OVF0addr" springen muss? Das sehe ich nirgends als Befehl oder so.

  10. #40
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Weil unter "org OVF0addr" das hier steht --> "rjmp zeitum" Also springt er dann zu zeitum :muh: *
    Ich sehe, daß man Dir manche Sachen nicht 2 mal sagen muß, gut.

    Das gibt es auch nicht als Befehl, das ist intern und von Atmel festgelegt,
    steht in der .inc Datei ganz unten drin
    passauf 0x000 -> Reset hier fängt er immer an
    0x001 -> External Interrupt0 Vector Address hier springt er immer hin wenn eksterner Interrupt0 ausgelöst wurde
    0x002 -> External Interrupt1 Vector Address
    ....
    0x009 ; Overflow0 Interrupt Vector Address -> und hier wenn der Timer 0 übergelaufen ist ?

    jetzt kommen wir der Sache mit .org blabla schon näher, was ?

Seite 4 von 53 ErsteErste ... 2345614 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen