ATMega16 tappar huvudet efter kodsnutt.
Postat: 7 mars 2008, 19:03:34
Jag har precis lött ihop ett testkort med en Mega16 för att för andra gången lära mig AVRns assembler språk, vilket skiljer en del från HC11an som jag tidigare har jobbat med.
Hur som helst, så är alla I/O pinnar utdragna till stiftlister med lysdioder i serie med 1K motstånd till Vcc. En 16MHz kristall med tillhörande kondningar är monterade & lika så en MAX232 krets.
Kortet funkar fint det lilla jag har testat hitintills.
I går när jag började knappla lite, så fick jag inte subbrutiner att köras. Detta berodde på att jag hade glömt att ange startadressen för stackpekaren till RAMEND.
Så ut på nätet & högg första bästa kodsnutt & klistrade in den i mitt lilla blink program.
Efter att ha laddat ner koden i processorn så ballade µcn ur så pass att jag inte kan programmera om den.
Ponyprog säger DeviceMissing.
Efter att ha kliat hål i huvudet, så bytte jag kretsen i hopp om att det var ESDn som hade tagit kretsen. Men efter att ha laddat ner samma mjukvara i den nya kretsen så blev den också helt hjärn död.
Jag har inte rört några fusebitar.
Är det någon som har några idér om vad fasen det är som händer?.
Det är kodsnutten nedan som ställer till det. & den är tänkt att blinka växelvis mellan Port C & D i väldigt snabb takt.
.include "m16def.inc"
.def Temp = R16 ;Gives "Defines" Register R16 the name Temp
//--- Interrupt Vector -------------------------------------------------
.org 0x0000
RJMP MAIN
MAIN:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
//--- Init --------------------------------------------------------------
Init_PORTC:
ldi r16, 0b11111111 ; Sätt Port C & D som utgång
out DDRC, r16
out DDRD, r16
//--- Main --------------------------------------------------------------
LOOP1:
ldi r16, 0xFF ; Ladda R16 med talet FF Och mata ut det till
out PORTC, r16 ; PORTC
rcall delay
ldi r16, 0xFF ; Ladda R16 med talet FF Och mata ut det till
out PORTD, r16 ; PORTD
rcall delay
ldi r16, 0x00 ; Ladda R16 med talet 00 Och mata ut det till
out PORTC, r16 ; PORTC
rcall delay
ldi r16, 0x00 ; Ladda R16 med talet 00 Och mata ut det till
out PORTD, r16 ; PORTD
rcall delay
rjmp Loop1
//----DELAY---
DELAY:
ldi R16, 255
DELAY_MS1: ;
dec R16
brne DELAY_MS1
ret
Hur som helst, så är alla I/O pinnar utdragna till stiftlister med lysdioder i serie med 1K motstånd till Vcc. En 16MHz kristall med tillhörande kondningar är monterade & lika så en MAX232 krets.
Kortet funkar fint det lilla jag har testat hitintills.
I går när jag började knappla lite, så fick jag inte subbrutiner att köras. Detta berodde på att jag hade glömt att ange startadressen för stackpekaren till RAMEND.
Så ut på nätet & högg första bästa kodsnutt & klistrade in den i mitt lilla blink program.
Efter att ha laddat ner koden i processorn så ballade µcn ur så pass att jag inte kan programmera om den.
Ponyprog säger DeviceMissing.
Efter att ha kliat hål i huvudet, så bytte jag kretsen i hopp om att det var ESDn som hade tagit kretsen. Men efter att ha laddat ner samma mjukvara i den nya kretsen så blev den också helt hjärn död.
Jag har inte rört några fusebitar.
Är det någon som har några idér om vad fasen det är som händer?.
Det är kodsnutten nedan som ställer till det. & den är tänkt att blinka växelvis mellan Port C & D i väldigt snabb takt.
.include "m16def.inc"
.def Temp = R16 ;Gives "Defines" Register R16 the name Temp
//--- Interrupt Vector -------------------------------------------------
.org 0x0000
RJMP MAIN
MAIN:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
//--- Init --------------------------------------------------------------
Init_PORTC:
ldi r16, 0b11111111 ; Sätt Port C & D som utgång
out DDRC, r16
out DDRD, r16
//--- Main --------------------------------------------------------------
LOOP1:
ldi r16, 0xFF ; Ladda R16 med talet FF Och mata ut det till
out PORTC, r16 ; PORTC
rcall delay
ldi r16, 0xFF ; Ladda R16 med talet FF Och mata ut det till
out PORTD, r16 ; PORTD
rcall delay
ldi r16, 0x00 ; Ladda R16 med talet 00 Och mata ut det till
out PORTC, r16 ; PORTC
rcall delay
ldi r16, 0x00 ; Ladda R16 med talet 00 Och mata ut det till
out PORTD, r16 ; PORTD
rcall delay
rjmp Loop1
//----DELAY---
DELAY:
ldi R16, 255
DELAY_MS1: ;
dec R16
brne DELAY_MS1
ret