- 3D-Druck Einstieg und Tipps         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 53

Thema: Assembler lernen

  1. #21
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Auf die Schnelle kritisiere ich nicht gerne. Und es fehlt mir aktuell wirklich an Assembler-Erfahrung. ABER: Am Ende des main wird ein rjmp angetreten von dem es kein Zurück gibt . . . . und wenn es ein Zurück gäbe, dann würde IMPLS angesprungen. Denn ich sehe nicht, dass main eine Endlosschleife ist.

    Aber wie gesagt - ich muss das mal in Ruhe durchlesen - und dann weiss ich ob ich überhaupt einen sinnvollen Kommentar abgeben kann. Vielleicht gibts erfahrene Assemblernutzer hier?
    Ciao sagt der JoeamBerg

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    auch die alternative mit der "kreis-schleife" statt dem power down (sleep) ändert nichts an der sache.
    hab vergessen zu sagen, dass (auch beim testen am tiny) an
    PB0 normal HI liegt (= LO interrupt)
    PB1 ein LO impuls kommt
    PB2 ein spannungsteiler (2x200k) mit vorwiderstand von 1k liegt, wobei immer eine seite durch einen schalter kurz geschlossen wird)
    es hängt also nichts "in der luft".
    PB3-PB5 zum testen je 1 led mit 1k gegen GND.

  3. #23
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man die ISRs nicht ordnungsgemäß wieder verläßt, wird der Stack irgenwann überlaufen. Das ist zumindestens bei clslatch der Fall.
    Das CLI am Anfang der ISR ist unnötig, das I Flag ist schon gelöscht.

    Hinter dem Sleep ist das programm einfach zuende, da muß eigentlich noch ein jump noch oben hin, denn nach einem Timer Interrupt geht es da weiter.

    Der AD Wandler wird so weit ich sehr nie eingeschaltet, sondern nur der Teiler gesetzt-

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    so, habe weiter getestet und bin auf einiges drauf gekommen:
    egal wie PB5 konfiguriert ist:
    als eingang mit einem 10k R gegen GND
    oder als ausgang mit einer led+1k an GND
    dann geht der tiny in den RESET modus !!!

    der int0 funktioniert weder mit + noch mit - flanke.
    habe alle varianten im MCUCR gesetzt und probiert.
    nur pinchange funktioniert (ausgenommen an PB5 - siehe oben).

    das habe ich mit folgendem testprogramm raus gefunden:
    Code:
    ; TEST
    
    #include "tn13def.inc"
    
    .cseg
    .org	0x000		; Interrupt Vektoren	
    	rjmp MAIN	; Hauptprogrammroutine (Reset)
    	rjmp IMPULS	; Interrupt0
    	rjmp IMPULS	; PinChangeInterrupt Tor zu
    	rjmp SCHLEIFE ; TimerOverFlow für Warteschleife
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    	rjmp SCHLEIFE ; Hauptprogrammroutine
    
    .def	PORT = R16
    .def	TEMP = R17
    
    MAIN:
    	cli
    	ldi	temp,LOW(RAMEND)
    	out	SPL,temp
    	ldi	temp,0b00011000	; Register für DDRB in/out laden
    	out	DDRB,temp	; 0 1 2 5 Eingänge  3 4 Ausgänge
    	ldi	temp,0b00000010	; Register für PORTB in/out laden
    	out	PORTB,temp	;  Eingang 1 pullup
    	ldi	temp,0b00000011	; 0b00000010 INT0 N-Flanke
    	out	MCUCR,temp	
    	ldi	temp,0b01100000	; GIMSK Interrupt Mask setzen
    	out	GIMSK,temp	; Int0 und PinChange enable
    	ldi	temp,33		; PinChange auf PB0 + PB5 beschränken
    	out	PCMSK,temp	
    	sei
    
    SCHLEIFE:
    	nop
    	rjmp	schleife
    
    IMPULS:
    	cpi	port,0
    	brne	next
    	ldi	port,8		; mit 8 und 16 PB3 + PB4 ein
    NEXT:
    	out	portb,port
    	lsl	port
    	cpi	port,32
    	brne	end
    	clr	port
    END:
    	sei
    	reti
    nur PB3 + 4 liegen mit einer led + 1k an masse, sonst ist der tiny nicht beschalten.
    als "schalter" an PB0+PB1 für die interrupts verwende ich einen 1k widerstand gegen Vcc oder Vdd.
    wenn ich an PB5 als pin change tippe = reset!

    am simulator des AVR studio4 funktioniert obiger code tadellos.
    warum nicht am tiny??
    kann es sein, dass er defekt ist?

    kann mir jemand weiter helfen?

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    hallo besserwessi,

    danke für deine mühe, dass du dir meinen code angeschaut hast!

    ich dachte diese beiden befehle starten den wandler? ist dem nicht so?
    sbi ADCSRA,ADEN ; ADC ENable
    sbi ADCSRA,ADSC ; ADC Start Conversion

    habe in "clslatch" die zeile >rjmp pwrdwn< durch >out SREG,savr< ersetzt, somit wird nun durch das >reti< die routine ordnungsgemäß beendet.

    überflüssiges cli entfernt und am ende von "pwrdwn" ein rjmp auf den anfang eingefügt/angehängt.

    hast du eine idee zum problem vom vorigen eintrag (INT0 + PB5)?

  6. #26
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das mit dem ADC einschalten hatte ich übersehen. Ich stelle den Teiler immer gleich beim Einschalten mit ein, vorher braucht man es ja nicht.
    Das mit dem AD Wandler könnte funktionieren.

    Aus dem PowerDown Sleep mode geht nur pin change oder Int0 mit Level Interrupt. Beim Leven Interrupt muß man auch noch aufpassen das man den von Hand in der ISR Abschalten muß, sonst wird der gleich nochmal aufgerufen. So wie es aussiehr geht bein Tiny13 nur ein Interrupts auf low Signal !

    Beim PB5 müßte man die Resetfunktion erst über die Fuses abschalten, bevor man den Pin als normalen IO Pin nutzen kann. Das heißt dann aber das man weder Debugwire noch das normale ISP Interface nutzen kann. Da würde ich eher probieren ob man da die normale Resetfunktion als Teil des Programmablaufts nutzen kann. Immerhin bleiben beim Reset einige Daten (RAM) erhalten. Man kann auch zwischen Signal an Reset und Power on unterscheiden.

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Zitat Zitat von Besserwessi
    Beim Leven Interrupt muß man auch noch aufpassen das man den von Hand in der ISR Abschalten muß, sonst wird der gleich nochmal aufgerufen. So wie es aussiehr geht bein Tiny13 nur ein Interrupts auf low Signal !
    was meinst du mit "Leven Interrupt" ?

    das mit dem nutzen der reset funktion ist eine gute idee.
    dazu braucht es aber nur einen impuls und kein solides signal.
    lässt sich aber lösen.

    danke

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von Besserwessi
    ... So wie es aussiehr geht bein Tiny13 nur ein Interrupts auf low Signal ...
    Zitat Zitat von Atmel-doc 2535, Rev. 2535H–AVR–10/07, S 54
    The INT0 interrupts can be triggered by a falling or rising edge or a low level.
    UUuuuups - könnte sein, dass Du das doc nicht hast oder suchen müsstest. Erstens: auf der At mel-doc-Download-site steht zum Tiny13 : Not recommended for new designs. Nichts destotrotz: Hol es Dir - zu jedem Controller gehört seine Dokumentation.
    Ciao sagt der JoeamBerg

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    ich hab das dokument.
    habe auch die verschiedenen varianten des int0 ausprobiert (MCUCR seite 27) - aber der tiny reagiert auf keine einizige variante (- + oder beides).
    es wird kein interrupt ausgelöst
    im simulator funktionierts tadellos (siehe code test programm) - ist eben SIMULATOR ...

    habe mir gerade einen neuen tiny13 besorgt.
    werde damit am abend testen ...

  10. #30
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn der Tiny13 im Powerdown mode ist, reagiert er nur auf den Level Interrupt (Input an GND) am Int0 Pin. Die Interrrupts auf Flanken gehen dann nicht. Steht bei der Erklärung der Sleep Modes im Datenblatt.

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test