- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: Eingabe über Taster geht nicht

  1. #1

    Eingabe über Taster geht nicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich bin gerade dabei mich in den ATMEGA8535 einzuarbeiten aber schon der erste Versuch ist ein Fehlschlag
    Ich habe das AVR Evalboard von Pollin gekauft aufgebaut und elektrisch funktioniert es auch. Nun möchte ich nur durch betätigen eines Tasters eine LED einschalten aber es geht nicht. Das Programm ist nun wirklich ziemlich simpel und im AVR Studio funktioniert es auch aber auf dem Board passiert nichts. End weder der Code ist falsch oder ich mache einen anderen Fehler.
    Code:
    ;********************************************************
    ;*                       			                    *
    ;*                   Testprogramm 	                    *
    ;*					 für das Pollin Evalboeard      	*
    ;*					 									*	
    ;********************************************************
    .nolist
    .include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
    .list
    
    rjmp Initial    	    ;Reset Handler
    rjmp nofunc 			;IRQ0 Handler
    rjmp nofunc 			;IRQ1 Handler
    rjmp nofunc 			;Timer2 Compare Handler
    rjmp nofunc 			;Timer2 Overflow Handler
    rjmp nofunc 			;Timer1 Capture Handler
    rjmp nofunc 			;Timer1 Compare A Handler
    rjmp nofunc 			;Timer1 Compare B Handler
    rjmp nofunc 			;Timer1 Overflow Handler
    rjmp nofunc 			;Timer0 Overflow Handler
    rjmp nofunc 			;SPI Transfer Complete Handler
    rjmp nofunc 			;USART RX Complete Handler
    rjmp nofunc 			;UDR Empty Handler
    rjmp nofunc 			;USART TX Complete Handler
    rjmp nofunc 			;ADC Conversion Complete Handler
    rjmp nofunc 			;EEPROM Ready Handler
    rjmp nofunc 			;Analog Comparator Handler
    rjmp nofunc 			;Two-wire Serial Interface Handler
    rjmp nofunc 			;IRQ2 Handler
    rjmp nofunc 			;Timer0 Compare Handler
    rjmp nofunc 			;Store Program Memory Ready Handler
    ;****************************************************************************
    ;
    ;Routine für den Fall das ein unerwarterter Interrupt eintritt
    ; 
    ;****************************************************************************
    
    nofunc:
    nop
    reti
    
    
    Initial:
    ldi R16,Low(RamEnd)
    out spl, R16         	
    ldi	R17, $E3
    out	DDRD, R17		
    
    
    Haupt:
    in   R17, PIND2
    sbic PORTD, 2
    sbi  PORTD, 6
    rjmp Haupt
    Vorab schon mal danke für eure Hilfe
    Gruß Bruno

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    60
    Beiträge
    1.305
    Blog-Einträge
    1
    Ich lass mal dein Programm außer acht.
    Mit Assembler kenne ich michnicht aus.

    ABER:

    Hast Du die Ports/Pins für den Taster als Input definiert?
    Dann schalte über einen 10kR Widerstand VCC (+5V) an den Pin.
    Der Taster schaltert dann bei betätigung gegen Masse (GND) also aktiv LOW.


    Hat dein Chip auf dem verwendeten Port evt. eine zweitfunktion, welche erst duch Fusebit deakiviert werden muss?
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    45
    Beiträge
    324
    Haupt:
    in R17, PIND2
    sbic PORTD, 2
    sbi PORTD, 6
    rjmp Haupt

    wäre schön wenn du die Interrupttabelle bei so leichten Programmen einfach wegläßt. Die rjmp Befehle vor jedem Interrupt würde ich auch gegen einen reti Befehl austauschen und nofunc: ganz weglassen.
    Aber das ist nicht die Ursache des Problems.

    Deute ich dein Programm richtig, dass du pind2 in r17 schreibst? Dann sollte die Abfrage unter sbic sich auch auf r17 beziehen( sbic r17,2). So wie es jetzt aussieht, fragt sbic Port D ab, ob pin 2 geschaltet ist.
    Dann müßte es funktionieren.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Routine für den Fall das ein unerwarterter Interrupt eintritt
    Du hast die Interrupts garnicht eingeschaltet, damit ist das alles nicht nötig.

    ldi R16,Low(RamEnd)
    out spl, R16
    und was ist mit dem SPH Register? oder hat ser 8535 nur 255 Bytes Ram ?

    ldi R17, $E3
    out DDRD, R17
    sowas zu schreiben ist zwar kürzer, aber nicht unbedingt einfacher zu lesen,

    schöner wäre es so:
    Code:
    
    ldi R17,(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD1)|(1<<PD0)
    out DDRD,R17
    naja, so sieht man zumindest sofort, welche Pins Du als Ausgang konfiguriert hast.

    in R17, PIND2
    Ergibt hier keinen Sinn (gibt es überhaupt Register PIND2, habe mir die .inc nicht angeguckt )

    Wogegen hängt Dein Taster, GND oder VCC?
    Meistens soll er an GND und die internen Pullups sollen aktiviert werden, das hast Du auch nicht getan.

    sbic PORTD, 2
    Damit fragst Du nur den Zustand von den Pullups ab, und nicht den Pinzustand.

    Dein Programm läßt sich so schreiben:


    Code:
    reset:
      ldi R17,(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD1)|(1<<PD0)
      out DDRD,R17
      ldi R17,(1<<PD2)
      out PORTD,R17
    ;oder besser
    ;sbi PORTD,PD2
    ;um den Pullup einzuschalten
    loop:
      sbis PIND,PD2
      sbi PORTD,PD6
      rjmp loop
    So müßte es eigentlich klappen

    Gruß Sebastian

  5. #5
    Hallo,
    vielen dank für die Antworten.
    Ich habe mal den ganzen overhead entfernt und mal das Programm so einfach wie möglich gemacht.
    Code:
    ;********************************************************
    ;*                       			                    *
    ;*                   Testprogramm 	                    *
    ;*					 für das Pollin Evalboeard      	*
    ;*					 									*	
    ;********************************************************
    .nolist
    .include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
    .list
    
            	
    ldi	R17, $E3
    out	DDRD, R17		
    
    
    Haupt:
    sbic PIND,  2
    sbi  PORTD, 5
    sbis PIND,  2
    cbi  PORTD, 5
    rjmp Haupt
    Der eigentliche Fehler lag darin das sbic PORTD, 2 so nicht funktioniert sonder dass man statt PORTD PIND angeben muss.
    Vielleicht sollte ich erst überlegen und dann fragen.
    Danke nochmals für eure Antworten.
    Gruß Bruno

Berechtigungen

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

Solar Speicher und Akkus Tests