- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Warum geht das Programm nicht? ...

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168

    Warum geht das Programm nicht? ...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute,

    folgendes Programm macht mir Probleme.
    Ich habe gerade mit den Interrupts angefangen.
    Hier das Programm:

    Code:
    .include "m8def.inc"
     
    .def temp = r16
    .def temp2 = r17
     
    .org 0x000
             rjmp main            ; Reset Handler
    .org INT0addr
             rjmp int0_handler    ; IRQ0 Handler
    .org INT1addr
             rjmp int1_handler    ; IRQ1 Handler
     
     
    main:                         ; hier beginnt das Hauptprogramm
     
             ldi temp, LOW(RAMEND)
             out SPL, temp
             ldi temp, HIGH(RAMEND)
             out SPH, temp
    
    		 ldi temp2, 0x00
     
             ldi temp, 0x00
             out DDRD, temp
     
             ldi temp, 0xFF
             out DDRB, temp
     
             ldi temp, 0b00001010  ; INT0 und INT1 konfigurieren
             out MCUCR, temp
     
             ldi temp, 0b11000000  ; INT0 und INT1 aktivieren
             out GICR, temp
     
             sei                   ; Interrupts allgemein aktivieren
     
    loop:    rjmp loop             ; eine leere Endlosschleife
     
    int0_handler:
             sbi PORTB, 0
             reti
     
    int1_handler:
             sbrs temp2, 0
    		 rcall f_led_on
    		 sbrc temp2, 0
    		 rcall f_led_off
             reti
    
    f_led_on:
    		sbi PORTB, 0
    		ldi temp2, 0xFF
    		ret
    
    f_led_off:
    		cbi PORTB, 0
    		ldi temp2, 0x00
    		ret
    Ich habe vor die Status-LED mit den Interrupts zu togglen.
    Was habe ich falsch gemacht?

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    was passiert denn wenn das programm läuft?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.112
    Hast Du vielleicht prellende Taster?
    Oder woher kommt der IRQ?
    Gruß

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo H3llGhost,
    läuft das Programm im Asuro?

    Wenn ja, frage ich mich wofür du den int0-Handler hast. Wenn hier ein 'Input' kommt, dann schaltest du ja die Status-LED (Grün-Seite) immer aus.

    Auch habe ich Probleme mit der Initialisierung vom DDRB-Register.
    Im Asuro werden mit:
    DDRB = IRTX | LEFT_DIR | PWM | GREEN_LED;
    die Pin's 0, 1, 2, 3, 4 und 5 als Output konfiguriert. Du machst alle 8 Pin's mit "ldi temp, 0xFF" und "out DDRB, temp"" zum Output.
    Funktioniert dann noch der Quarz?

    Die von Gock vermuteten prellenden Taster, müsste man testen können. Einfach häufig einen Taster drücken. Per Zufall sollten beide LED-Zustände dann sichtbar werden.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    ich denke die quarz-pins werden ignoriert wenn der externe quarz durch fuses eingestellt ist.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Habe nun folgenden Code:

    Code:
    .include "m8def.inc"
     
    .def temp = r16
     
    .org 0x000
             rjmp main            ; Reset Handler
    .org INT0addr
             rjmp int0_handler    ; IRQ0 Handler
    .org INT1addr
             rjmp int1_handler    ; IRQ1 Handler
     
     
    main:                         ; hier beginnt das Hauptprogramm
     
             ldi temp, LOW(RAMEND)
             out SPL, temp
             ldi temp, HIGH(RAMEND)
             out SPH, temp
     
             ldi temp, 0x00
             out DDRD, temp
     
             ldi temp, 0xFF
             out DDRB, temp
     
             ldi temp, 0b00001010  ; INT0 und INT1 konfigurieren
             out MCUCR, temp
     
             ldi temp, 0b11000000  ; INT0 und INT1 aktivieren
             out GICR, temp
     
             sei                   ; Interrupts allgemein aktivieren
     
    loop:    rjmp loop             ; eine leere Endlosschleife
     
    int0_handler:
             sbi PORTB, 0
             reti
     
    int1_handler:
             sbis PORTB, 0
    		 rjmp f_led_on
    		 rjmp f_led_off
    
    f_led_on:
    		sbi PORTB, 0
    		reti
    
    f_led_off:
    		cbi PORTB, 0
    		reti
    Der funktioniert auch!
    Nun eine Frage am Rande, warum kann ich keinen rcall im int1_handler genutzen?
    Und was bringt der int0_handler?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo H3llGhost,
    sag einmal, liest du eigendlich die Post's, die auf deine Fragen geschrieben werden?
    Eigendlich hatte ich DICH gefragt, wofür DU den int0_handle eingebaut hast.
    Außerdem wäre es ganz nett, wenn du Hilfe suchst, dass du dann auch mal die Fragen beantwortest, die dir gestellt werden, um DIR zu helfen.

    @damaltor
    Ich bin mir nicht sicher was die Pin's für den Quarz angeht.
    Ich glaube, hier im Forum mal eine Erweiterung, oder die Idee dazu, gesehen zu haben, dass der Quarz ausgelötet wird, und die beiden Pin's dann auf eigenen Erweiterungen genutzt werden sollen. Da liegt doch SPI, wenn ich mich jetzt ohne Handbuch erinnern sollte? Das wäre ja sehr interessant.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    wenn der quarz rausgenommen wird, muss in den fusebits "interner takt" eingestellt werden, sonst macht der prozessor ohnehin gar nichts. und dann sind die pins frei verfügbar und können genutzt werden.

    die pins haben folgende funktionen:
    PB6, XTAL1, TOSC1
    PB7, XTAL2, TOSC2

    also kein spi =)

    die sache ist, sowie der quarz in den fuses eingestellt ist, aber keiner angeschlossen ist, macht der prozessor ohnehin gar nichts. und wenn der quarz nicht eingestellt wurde, sind die pins frei und dürfen verwendet werden. man lönnte dann entweder mit dem internen tgaktgenrator arbeiten (beide pins sind dann frei), mit einem externen taktsignal (ein ne555 reicht aus, dann wird nur ein pin am prozessor verbraten). wenn irgendwo in derf schaltung schon ein taktsignal vorliegt, kann dieses angezapft werden. oder man arbeitet mit einem R-C-Glied, das ist allerdings recht ungenau (genau wie der interne oszillator der auch bloss aus R und C besteht. diese kombination braucht auch nur einen pin am prozessor.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Zitat Zitat von Sternthaler
    Hallo H3llGhost,
    sag einmal, liest du eigendlich die Post's, die auf deine Fragen geschrieben werden?
    Eigendlich hatte ich DICH gefragt, wofür DU den int0_handle eingebaut hast.
    Außerdem wäre es ganz nett, wenn du Hilfe suchst, dass du dann auch mal die Fragen beantwortest, die dir gestellt werden, um DIR zu helfen.
    [...]
    Oh ...
    tut mir Leid, dass habe ich überlesen ...
    Ich weiß es selber nicht warum der int0_handle benutzt wird.
    Ich habe den Code von hier Klick.

    Und da ich den Sinn nicht verstanden hatte, fragte ich nach ...
    Aber ich bin ja anscheinend nicht die einzige Person ...

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo H3llGhost,
    alles klar.

    In dem Beispiel auf der von dir angegeben Seite werden tatsächlich beide Interrupts benutzt. Die gehen ja nicht davon aus, dass der Code unbedingt im Asuro spielen soll.
    Dort wird Int-0 zum EIN-schalten von Pin 0 an Port B, und Int-1 zum AUS-schalten vom Pin 0 an Port B benutzt.
    Du kannst somit den Int-0-Interrupt bei dir ohne Probleme löschen, da du ja über Int-1 deine Status-LED (Grün) EIN- und AUS-schaltest.

    Warum aber rcall nicht gehen sollte, kann ich nicht sagen. Ich finde jedenfalls keine Einschränkung dazu.

    @damaltor
    Na die Sache mit der Initialisierung scheint ja wirklich keine Auswirkungen zu haben.
    Wenn also nun das Programm mit den rjmp-Befehlen funktioniert, taktet da ja wohl auch irgendetwas in der CPU rum.
    Hast du wohl Recht.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen