Anfängerprobleme mit AT90USB162
Hallo!
Ich habe ein kleines Anfängerproblem. Welche INCLUDE muss ich für den AT90USB162 verwenden um ein Assemblerprogramm schreiben zu können? Ich verwende AVRStudio 4.13 falls das relevant ist.
Ich will momentan nur ein paar Leds ein und ausschalten, was ja eigentlich nicht so schwer sein sollte.
Vor kurzem habe ich mir einen eStick gekauft, falls das jemand kennt (5-10 euro, bei so einem Preis musste ich zuschlagen ^^), da ist eben dieser Controller eingebaut.
Code:
.NOLIST ; List-Output unterdrücken
.INCLUDE <m162def.inc>
.LIST ; List-Output wieder aufdrehen
;Registeraufteilung
.def temp = r16
.DSEG ; Schreibt Daten in den SRAM
.CSEG ; was nun folgt, gehört in den FLASH-Speicher
.org 0x0000
rjmp Initialisierung
Initialisierung:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 0b11111111
out DDRB, temp ; Ausgang
out DDRC, temp
Hauptprogramm:
sbi PortC, 2
sbi PortB, 0
cbi PortB, 1
sbi PortB, 2
cbi PortB, 3
sbi PortB, 4
cbi PortB, 5
sbi PortB, 6
cbi PortB, 7
Ende:
rjmp Ende
Diesen Code habe ich getestet, was mcih wundert das absolut nichts am ausgang passiert, weder die DDR bits werden gesetzt, noch die Port bits :( (HILFE)
Bitte helft mir, kann ja nicht so schwer sein 4 Leds einzuschalten
mfg
Gerko
EDIT:
Ok, ich hab jetzt die richtige Include datei gefunden (USB162def.inc klingt irgendwie logisch, ist allerdings im AVR 2 oderner gelagert, warum auch immer)
das Programm funktioniert auf dem e-Stick allerdings immer noch nicht:
Code:
.NOLIST ; List-Output unterdrücken
.INCLUDE <usb162def.inc>
.LIST ; List-Output wieder aufdrehen
;Registeraufteilung
.def temp = r16
;.DSEG ; Schreibt Daten in den SRAM
.CSEG ; was nun folgt, gehört in den FLASH-Speicher
.org 0x0000
rjmp Initialisierung
Initialisierung:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 0b11111111
out DDRB, temp ; Ausgang
sbi DDRC, 2
sei
Hauptprogramm:
sbi PortC, 2
sbi PortB, 0
cbi PortB, 1
sbi PortB, 2
cbi PortB, 3
sbi PortB, 4
cbi PortB, 5
sbi PortB, 6
cbi PortB, 7
Ende:
rjmp Ende
Das ist mein code, in der Simulation funktioniert es, allerdings nicht auf dem e-Stick :(
Das ist der Schaltplan dazu:
http://embsys.technikum-wien.at/staf..._schematic.pdf
ich weiß nicht ganz warum es nicht funktioniert, wenn ich PortC2 setze, müssten die Leds aktiviert sein (so versteh ich das zumindest)
hat jemand eine Idee was ich noch anders machen muss?
mfg
Gerko
noch ein Problem mit dem AT90USB162
Hallo!
Ich komme von einem Proglem zum nächsten!
Diesmal ist es ein Progblem mit dem Timer, hier ist mal das Programm:
Code:
.NOLIST ; List-Output unterdrücken
.INCLUDE <usb162def.inc>
.LIST ; List-Output wieder aufdrehen
;Registeraufteilung
.def temp = r16
.CSEG ; was nun folgt, gehört in den FLASH-Speicher
.org 0x0000
jmp Initialisierung ;RESET
jmp kein_Interrupt ;INT0 ;External Interrupt Request 0
jmp kein_Interrupt ;INT1 ;External Interrupt Request 1
jmp kein_Interrupt ;INT2 ;External Interrupt Request 2
jmp kein_Interrupt ;INT3 ;External Interrupt Request 3
jmp kein_Interrupt ;INT4 ;External Interrupt Request 4
jmp kein_Interrupt ;INT5 ;External Interrupt Request 5
jmp kein_Interrupt ;INT6 ;External Interrupt Request 6
jmp kein_Interrupt ;INT7 ;External Interrupt Request 7
jmp kein_Interrupt ;PCINT0 ;Pin Change Interrupt Request 0
jmp kein_Interrupt ;PCINT1 ;Pin Change Interrupt Request 1
jmp kein_Interrupt ;USB General ;USB General Interrupt request
jmp kein_Interrupt ;USB Endpoint ;USB Endpoint Interrupt request
jmp kein_Interrupt ;WDT ;Watchdog Time-out Interrupt
jmp kein_Interrupt ;TIMER1 CAPT ;Timer/Counter1 Capture Event
jmp kein_Interrupt ;TIMER1 COMPA ;Timer/Counter1 Compare Match A
jmp kein_Interrupt ;TIMER1 COMPB ;Timer/Counter1 Compare Match B
jmp kein_Interrupt ;TIMER1 COMPC ;Timer/Counter1 Compare Match C
jmp kein_Interrupt ;TIMER1 OFV ;Timer/Counter1 Overflow
jmp kein_Interrupt ;TIMER0 COMPA ;Timer/Counter0 Compare Match A
jmp kein_Interrupt ;TIMER0 COMPB ;Timer/Counter0 Compare Match B
jmp TIMER0_OVF ;Timer/Counter0 Overflow
jmp kein_Interrupt ;SPI, STC ;SPI Serial Transfer Complete
jmp kein_Interrupt ;USART1 RX ;USART1 Rx Complete
jmp kein_Interrupt ;USART1 UDRE ;USART1 Data Register Empty
jmp kein_Interrupt ;USART1TX ;USART1 Tx Complete
jmp kein_Interrupt ;ANALOG COMP ;Analog Comparator
jmp kein_Interrupt ;EE READY ;EEPROM Ready
jmp kein_Interrupt ;SPM READY ;Store Program Memory Ready
kein_Interrupt:
reti
Initialisierung:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 0b11111111
out DDRB, temp ; Ausgang
sbi DDRC, 2
;Timer0 aktivieren
ldi temp, 0b00000001
out TIMSK0, temp
ldi temp, 0b00000101
out TCCR0B, temp
sei
Hauptprogramm:
sbi PortC, 2
ldi temp, 0b01010101
out PortB, temp
Ende:
rjmp Ende
TIMER0_OVF:
push temp
in temp, SREG
push temp
cpi temp, 0b01010101
breq PC+3
ldi temp, 0b01010101
rjmp PC+2
ldi temp, 0b10101010
out PortB, temp
pop temp
out SREG, temp
pop temp
reti
Die Probleme sind nun, das ich den Timer0 Overflow interrupt nicht ohne Fehlermeldung aktivieren kann. Er schreibt dann immer hin: "error, Operant 1 out of range: 0x6e"
0x6e ist TIMSK0. Seltsamer weise steht beim TIMSK0 bei der Adresse na(0x6e). Wenn na jetzt not avalable heißt, was den fehler erklären würde, dann frage ich mich, warum steht das da?
Im Simmulator ist das allerdings kein Problem da man ja einfach den Interrupt so aktivieren kann (per Mausklick), allerdings springt der ausgelöste Interrupt nicht auf die richtige Adresse!!!
jetzt frage ich mich WARUM ärgert mich der Atmel so sehr?
Bitte Helft mir, auch wenn es nur eine bestätigung für einen richtigen code ist :)