- Labornetzteil AliExpress         
Seite 37 von 53 ErsteErste ... 27353637383947 ... LetzteLetzte
Ergebnis 361 bis 370 von 524

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

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

    LiFePo4 Akku selber bauen - Video
    Thomas, geh doch mal punkt für Punkt alles durch, so wie gestern mit dem tatü-tata.
    Wenn es sein muß schmeiß Dein Programm weg, und fang neu an, geh auf den Balkon,
    Veranstallte was mit Deiner Freundin, krieg wieder klaren Kopf.
    Dann fang neu an, Du schaffst es, ich weiß, hier erwartet keiner was von Dir, es ist nicht leicht,Du hast heute jedemenge neue Sachen kennengelernt, wenn Du dann immer nicht weiterkommst dann gehe ich nochmal alles mit Dir durch, kein Problem

  2. #362
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ok, ich denk, das ist das beste. Ich werd jetzt schlafen gehen und morgen früh aufstehen und mich ransetzen.
    Danke für eure Unterstützung

    Gute Nacht und Gruß
    Thomas

  3. #363
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Das habe ich vor 10 Seiten schonmal angesprochen, das ist sehr gut!
    In der Tat, das hast Du
    Die Datei ist mir gerade so "vor die Füße gelaufen" als ich ein Dattenblatt gesucht habe,
    und dann dachte ich mir, warum soll ich sie hier nicht posten...

  4. #364
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Gute Nacht!
    Morgen wird alles wieder gut! ;o)

  5. #365
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Guten Morgen,
    hab zwei Fragen:
    Was bringt das?:
    Code:
    ; Reset and Interrupt vector	; VNr.  Beschreibung
    	rjmp	main	; 1   POWER ON RESET
    	reti		; 2   Int0-Interrupt
    	reti		; 3   Int1-Interrupt
    	reti		; 4   TC2 Compare Match
    	reti		; 5   TC2 Overflow
    	reti		; 6   TC1 Capture
    	reti		; 7   TC1 Compare Match A
    	reti		; 8   TC1 Compare Match B
    	reti		; 9   TC1 Overflow
    	reti		; 10  TC0 Overflow
    	reti		; 11  SPI, STC Serial Transfer Complete
    	reti		; 12  UART Rx Complete
    	reti		; 13  UART Data Register Empty
    	reti		; 14  UART Tx Complete
    	reti		; 15  ADC Conversion Complete
    	reti		; 16  EEPROM Ready
    	reti		; 17  Analog Comparator
    	reti		; 18  TWI (I²C) Serial Interface
    	reti		; 19  Store Program Memory Ready
    und das?:
    Code:
    ldi temp, LOW(RAMEND)      ;LOW-Byte der obersten RAM-Adresse 
          out SPL, temp 
          ldi temp, HIGH(RAMEND)      ;HIGH-Byte der obersten RAM-Adresse 
          out SPH, temp
    Gruß Michi

  6. #366
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Guten morgen Michael!
    Das Erste ist die sogenannte Interruptvektortabelle, schau Dir das ganze am Besten mal bei http://www.mikrocontroller.net/tutorial/interrupts an!
    Das Zweite ist die Konfigurierung bzw. aktivierung des sogenannten Stacks! http://www.mikrocontroller.net/tutorial/stack

  7. #367
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi Florian,
    was bringt das ganze denn das erste wird hier in diesem Thread immer weggelassen! Und das zweite scheint ja auch nicht nötig zu sein denn mein Programm funktioniert auch ohne diesen Teil!
    Gruß Michi

  8. #368
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2005
    Beiträge
    22
    Moin moin,

    @Masters
    Danke fuer die Pdf's. Die sind wirklich sehr gut!
    Und danke für den Bug-Hinweis.
    Um AVRStudio zu benutzen, kann ja Sebastian unter Linux VMware einsetzen. Das funktioniert sehr gut!

    @Thomas
    siehe mal, was man hier so alles findet
    https://www.roboternetz.de/phpBB2/dl...le&file_id=169

    Und hier ist die bereinigte Version. Ich schalte die beiden Timer am Ende aus, damit der uC auch in der Looping-Schleife bleibt.
    Code:
    .include "m8def.inc"
    
    ;; Wir wollen mit dem Timer2 einen Interrupt pro Sekunde ausloesen.
    ;; Asuro hat einen 8MHz Quarz. Wir waehlen eine Prescaler von 1024 aus( 8, 32, 64, 128, 256, 1024)
    ;; 8MHz/1024 = 8000000Hz/1024 = 7812,5 Hz die Timerfrequenz.
    ;; -> ein Timerschritt dauert 1/7812,5 = 0,000128s = 128us.
    ;; -> Fuer eine Sekunde muessten also 1s/128us = 7812 Timerschritte ausgef?hrt werden.
    ;; Da das nur ein 8-bit Timer ist, macht er 256 Schritte zum Ueberlauf.
    ;; -> Des wegen barauchen wir eine Hilfsvariable,
    ;; um speichern zu koennen , wieviele Ueberlaeufe er schon hinter sich hat.
    ;; -> 7812 = 36 * 217
    ;; -> 36 mal soll der Timer bis 217 Zahlen -> dann ist eine Sekunde vergangen
    .EQU TIMER2 = 256 - 217	
    .EQU counts2 = 36
    
    .EQU FRONT_LED		= PD6	; Dran haengt auch ein Summer :)
    
    .DEF erg		= R0	; Das Register wird vom LPM-Befehl benutzt
    .DEF tmp 		= R16	; Fuer algemeine Zwecke
    .DEF counter2 		= R17	; Hier speichern wir, wieviele Ueberlaufe der Timer2 schon hatte
    .DEF frequence		= R18	; Hier wird die aktuelle Frequenz des Summers gespeichert
    
    
    .CSEG
    .ORG 0x000
    	RJMP RESET   	; Interruptvektor reset
    
    .ORG OVF2addr		; Interruptvektor fuer Timer2 Ueberlauf.
    	RJMP TIM2_OVR	; Dahin wird gesprungen, wenn der Timer2 ueberlaeuft
    
    .ORG OVF0addr		; Interruptvektor fuer Timer0 Ueberlauf.
       	RJMP TIM0_OVR	; Dahin wird gesprungen, wenn der Timer0 ueberlaeuft
    
    
    RESET:
    	;; Initializierung des Stackpointers
    	LDI tmp, LOW(RAMEND)			; LOW-Byte der obersten RAM-Adresse
    	OUT SPL, tmp
    	LDI tmp, HIGH(RAMEND)			; HIGH-Byte der obersten RAM-Adresse
    	OUT SPH, tmp
    
    
    	SBI DDRD,FRONT_LED			; Der Pin an dem die FrontLed und jetzt der Summer haengen
    						; als Ausgang definieren
    
    	LDI frequence, 255			; Die zahl mit dem der Counter vom Timer0 geladen wird
    
    	;; Timer2 Register werden belegt
    	;; Es wird Timer2 benutzt
       	LDI tmp,(1<<CS22)|(1<<CS21)|(1<<CS20)	; Prescaller ist 1024. Also Lade (0000 0100 V 0000 0010 V 0000 0001) = 0000 0111 in tmp
    	OUT TCCR2,tmp   			; Register TCCR2 ist fuer den Prescaller zustaendig (siehe Datenblatt)
    	LDI tmp,TIMER2 				; Hier wird der Timer2 vorgeladen und zwar mit TIMER2. Siehe oben.
    	OUT TCNT2,tmp	  			; Er laeuft counts2 mal durch bevor ein Interrupt auftritt. Siehe CPI- Vergleich in main
    	
    	;; Timer0 Register werden belegt
    	;; Es wird Timer0 benutzt
       	LDI tmp,(1<<CS01) | (1<<CS00)	; Prescaller ist 64. Also Lade (0000 0010 V 0000 0001) = 0000 00011 in tmp
    	OUT TCCR0,tmp   		; Register TCCR0 ist fuer den Prescaller zustaendig (siehe Datenblatt)
    	
    	OUT TCNT0,frequence   		; Counter vom Timer0 laden. 
    	
    	LDI tmp,(1<<TOIE2) | (1<<TOIE0)	; Hier werden Interrupts fuer einen Ueberlauf von Timer2 bzw. Timer0 eingeschaltet
    	OUT TIMSK,tmp   		; Register TIMSK ist dafuer zustaendig
    	
    	LDI ZH,HIGH(2*toene)		; Lade die Adresse unserer Daten in das z-Register
    	LDI ZL,LOW(2*toene)		; "2*" - es ist so :)
    	
    	SEI      			; Interrupts allgemein zulassen
    
    main:
    	CPI counter2, counts2		; Vergleiche ob der Timer2 schon counts2 mal durchgelaufen hat
    	BREQ switch_frequence		; Wenn ja, gehe zu switch_frequnce
    	RJMP main			; sonts Looping
    
    switch_frequence:
    	CLR counter2			; Counter2 auf 0 setzen. Der Timer2 soll wieder counts2 mal durchlaufen
    		
    	LPM				; Lese ein Byte aus dem Programmspeicher - Naechster Tonewert
    	TST erg                         ; R0 auf 0 testen
            BREQ ende			; Ein ja bedeutet, dass wir am Ende sind -> Ende
    	
    	LDI frequence, 255		; Kein Kommentar
    	SUB frequence, erg		; Rechne den entsprechenden Wert fuer den Counter
    	OUT TCNT0, frequence		; Beschreibe den Counter von Time0 mit dem Wert
    	
    	ADIW ZL,1			; Pointer auf das naechste Byte
    	RJMP main			; Kehre zurueck zum main
    	
    ende:
    	LDI tmp,(0<<CS02)|(0<<CS01)|(0<<CS00)	; Den Timer0 ausschalten
    	OUT TCCR0,tmp   			; Register TCCR0 ist dafuer zustaendig (siehe Datenblatt)
    	LDI tmp,(0<<CS22)|(0<<CS21)|(0<<CS20)	; Den Timer2 ausschalten
    	OUT TCCR2,tmp   			; Register TCCR2 ist dafuer zustaendig (siehe Datenblatt)
    
    looping:	
    	RJMP looping			; Die unendliche Geschichte :)
    	
    TIM2_OVR:
    	PUSH tmp			; Benutztes Register auf den Stack
    	IN tmp, SREG			; Zustand des Statusregisters einlesen
    	PUSH tmp			; Ebenfalls auf den Stack ablegen
    	
    	INC counter2			; Der Timer2 hat wieder mal einen Ueberlauf
    	
    	LDI tmp, TIMER2         	; Kein Kommentar
    	OUT TCNT2, tmp          	; Conuter vom Timer2 erneut laden
    	
    	POP tmp				; Alten SREG-Inhalt vom Stapel holen
       	OUT SREG, tmp 			; und das Statusregister wiederherstellen
       	POP tmp				; tmp wiederherstellen
    	RETI				; Setzte das durch den Interrupt unterbrochenes Programm fort
    	
    
    TIM0_OVR:
    	PUSH tmp			; Benutztes Register auf den Stack
    	IN tmp, SREG			; Zustand des Statusregisters einlesen
    	PUSH tmp			; Ebenfalls auf den Stack ablegen
    	
    	SBIC PIND,FRONT_LED		; Was ist auf dem PIND6? 
    	RJMP off			; Wenn 1, dann schalte auf 0
    	RJMP on				; Wenn 0, dann schalte auf 1
    off:	
    	CBI PORTD,FRONT_LED		; schalte auf 0
    	RJMP exit			; gehe zu exit
    on:
    	SBI PORTD,FRONT_LED		; schalte auf 1
    exit:	
    	OUT TCNT0,frequence		; Conuter vom Timer0 erneut laden
    	
    	POP tmp				; Alten SREG-Inhalt vom Stapel holen
       	OUT SREG, tmp 			; und das Statusregister wiederherstellen
       	POP tmp				; tmp wiederherstellen
    	RETI				; Setzte das durch den Interrupt unterbrochenes Programm fort	
    
    toene:
    .DB 213, 234, 150, 34, 123, 45, 123, 100, 80, 200, 214, 0 ; ich hatte keine Lust die richtigen Tonwerte auszurechenn :)
    So, wann kommt die naechste Aufgabe?
    Best wishes

  9. #369
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hallo Michael!
    Wir haben uns hier auf die Kurzschreibweise geeinigt:
    Code:
    .org 0x000 
          rjmp reset               ;Interruptvektor "reset:" 
    
    .org OVF2addr 
       rjmp pruefSek            ;Interruptvektor "pruefSek:" 
    
    .org OVF0addr 
       rjmp timerSummer         ;Interruptvektor "timerSummer:"
    Es kann sein, dass es auch ohne den Stack funktioniert, solange Du keine Sprünge mit rcall o.ä. machst!
    Lies Dir die oben beschriebenen Artikel durch und frag was Du nicht verstehst! *aber erst lesen -> intensiv*

  10. #370
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hallo Tekeli!
    Wir sind ja noch nicht fertig! *lol*
    ich bitte um ein wenig Gedult! ;o)

Seite 37 von 53 ErsteErste ... 27353637383947 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test