Hallo zusammen,
ich habe Sorgen beim Programmieren eines winzigen Programms in Asm. Ich nutze zum ersten Mal den mega 8515. Nach dem Flashen und dem ersten Start, dimmt B0 von voller Lichtstärke auf 0 herunter dann geht nichts mehr.
Folgendes hab ich schon versucht, vielleicht hat jemand einen Tipp für einen Anfänger.
- ich nutze myavrwordpad und studio 4 mit mysmartusb MK2
- das Programm lässt sich problemlos einspielen
- wenn ich nur die Unterprogramme EDIMM und ADIMM ins Hauptprog schreibe funktioniert der Dimmvorgang am Ausgang
- Einfache I/O Programme mit den Eingängen auf eine LED an D3 funktionieren auch
- Programm läuft in der Studio-Simu
- Externer Quarz 4MHz und Interner Oszi machen das gleiche (natürlich nicht in der selben Zeit)
- Es funktioniert nur das große Ganze nicht und da hab ich Sleep und Comperator noch nicht drin, es soll ja dann noch mehr rein.
Nun mein kleines Prog
Code-Tags sind cool ! (PicNick)Code:;+---------------------------------------------------------------------------- ;| Schaltung : ATmega8515 ;| B.2 & B.3 Analogeingang Dämmerungsschalter ;| C.0 & C.1 Eingänge für Bewegungsmelder ;| D.3 LED Dämmerungsschalter ;| B.0 pulsweitenmoduliertes Signal (Licht) ;|---------------------------------------------------------------------------- ;| Prozessor : ATmega8515 ;| Sprache : Assembler ;| Version : ;+---------------------------------------------------------------------------- .include "avr.h" ;----------------------------------------------------------------------------- ;Reset and Interrupt vector ; VNr. Beschreibung rjmp main ;1 POWER ON RESET reti ;2 Int0-Interrupt reti ;3 Int1-Interrupt reti ;4 TC1 Capture reti ;5 TC1 Compare Match A reti ;6 TC1 Compare Match B reti ;7 TC1 Overflow reti ;8 TC0 Overflow reti ;9 SPI, STC Serial Transfer Complete reti ;10 UART Rx Complete reti ;11 UART Data Register Empty reti ;12 UART Tx Complete reti ;13 Analog Comparator reti ;14 Int2-Interrut reti ;15 EEPROM Ready reti ;16 TC0 Compare Match reti ;17 Store Program Memory Ready ;----------------------------------------------------------------------------- ;Start, Power ON, Reset main: ldi r16,lo8(RAMEND) ;Konfiguration des Stackspeichers out SPL,r16 ;ans Ramende (Low-Byte) ldi r16,hi8(RAMEND) ;Konfiguration des Stackspeichers out SPH,r16 ;ans Ramende (High-Byte) ;Konfiguration des Analogsignals cbi ACSR,7 ;Comperator ON cbi ACSR,6 ;ext. Referenzspannung (Vref AIN0) ;Konfiguration des pulsweitenmodulierten Signalausgangs sbi DDRB,0 ;PORT B.0 = Ausgang ldi r16,0b01110010 ;Konfiguration PWM-Signal out TCCR0,r16 ; ;Ein- Ausgangskonfiguation sbi DDRD,3 ;PORT D.3 = Ausgang cbi DDRC,0 ;PORT C.0 = Eingang cbi DDRC,1 ;PORT C.1 = Eingang sbi PORTC,0 ;Entstöre Eingang PORT C.0 sbi PORTC,1 ;Entstöre Eingang PORT C.1 ;Grundwerte laden ldi r16,0x00 ;Register 16 = 0 ldi r17,0x00 ;Register 17 = 0 ;----------------------------------------------------------------------------- ;Hauptprogrammschleife Hauptprog: in r17,PINC sbrs r17,0 rjmp Lichtan in r17,PINC sbrs r17,1 rjmp Lichtan cbi PORTD,3 rcall WARTEZ rcall ADIMM rjmp Hauptprog Lichtan: sbi PORTD,3 rcall EDIMM rjmp Hauptprog ;----------------------------------------------------------------------------- ;Unterprogramm Eindimmen EDIMM: rcall V_DIMM ;Rufe Unterprog Dimmgeschwindigkeit auf cpi r16,0xFF ;Prüfe Beleuchtungsstärke breq END_EDIMM ;Wenn Beleuchtung = MAX springe zu END_EDIMM inc r16 ;Wenn Beleuchtung < MAX erhöhe Beleuchtungsst. out OCR0,r16 ;Speicher neue Beleuchtungsstärke rjmp EDIMM ;Starte Unterprog Eindimmen neu END_EDIMM: ret ;Eindimmen Abgeschlossen - zurück zum Aufruf ;----------------------------------------------------------------------------- ;Unterprogramm Ausdimmen ADIMM: rcall V_DIMM ;Rufe Unterprog Dimmgeschwindigkeit auf cpi r16,0x00 ;Prüfe Beleuchtungsstärke breq END_ADIMM ;Wenn Beleuchtung = MIN springe zu END_ADIMM dec r16 ;Wenn Beleuchtung > MIN verringere Beleuchtungsst. out OCR0,r16 ;Speicher neue Beleuchtungsstärke rjmp ADIMM ;Starte Unterprog Ausdimmen neu END_ADIMM: ret ;Ausdimmen Abgeschlossen - zurück zum Aufruf ;----------------------------------------------------------------------------- ;Unterprogramm Wartezeit WARTE_1s: push r18 ;r18 sichern ldi r18,19 ;Lade Zeitkonstante 01 WARTE_1s_3:push r18 ;r18 sichern ldi r18,255 ;Lade Zeitkonstante 02 WARTE_1s_2:push r18 ;r18 sichern ldi r18,255 ;Lade Zeitkonstante 03 WARTE_1s_1:dec r18 ;r18 -1 brne WARTE_1s_1 ;Wenn r18 nicht 0, springe zu WARTE_1s_1 pop r18 ;Lade r18 aus Speicher dec r18 ;r18 -1 brne WARTE_1s_2 ;Wenn r18 nicht 0, springe zu WARTE_1s_2 pop r18 ;Lade r18 aus Speicher dec r18 ;r18 -1 brne WARTE_1s_3 ;Wenn r18 nicht 0, springe zu WARTE_1s_3 pop r18 ;Lade r18 aus Speicher ret ;Zurück zur Aufrufadresse ;----------------------------------------------------------------------------- ;Unterprogramm Wartezeit WARTEZ: ldi r20,30 ;Lade Wartezeit in Sekunden WARTEZ_1: rcall WARTE_1s ;Springe in Unterprogramm WARTE_1s dec r20 ;r20 -1 brne WARTEZ_1 ;Wenn r20 nicht 0, springe zu WARTEZ_1 ret ;Zurück zur Aufrufadresse ;----------------------------------------------------------------------------- ;Unterprogramm Dimmgeschwindigkeit V_DIMM: ldi r18,255 ;Laufzeit 5 LAUFZ_5: ldi r19,255 ;Laufzeit 6 LAUFZ_6: dec r19 ;Zähler 6 -1, hier Kalibrierung auf Quarz-Takt brne LAUFZ_6 ;Solange nicht NULL dec r18 ;Zähler 5 -1 brne LAUFZ_5 ;Solange nicht NULL ret ;Zurück zur Aufrufadresse
Ich hoffe es lässt sich lesen, bin halt Anfänger und liebe Kommentare.
Vielen Dank im Voraus für eure Hilfe
Davidfdg
Edit 16.02. 22:11
Hab grad ein myMultiProg MK2 zusammen gelötet und den 8515 damit geflasht. Leider ohne Erfolg. Problem bleibt wie beschrieben. Weiß aber nun, dass meine selbst gebastelte ISP-Schnittstelle keine Probleme macht.







Zitieren

Lesezeichen