Noggranna sekunder i stället för RTC...
Hallå där erixon och matseng och tack för den intressanta koden!
Var har ni lärt er detta? Jag har tidigare jobbat med stordatorer t ex IBM och för dessa finns alltid fullständiga manualer med ett eller flera exempel på ALLT. Dessutom har de ständig telefonsupport.
Det första försöket jag gjorde med 8515 var ett enkelt försök med rcall men det funkade ju inte. Man hoppade tillbaka till fel ställe efter utförd subrutin. Läste i instruktionsbeskrivningen men kom ingen vart. Skickade då mail till tillverkaren av AVR Studio och de svarade:
Hi,
You have to setup your stack pointer, like this:
ldi temp,low(RAMEND)
out SPL,temp
Please refer to the on-line help.
Regards,
-AVR technical support
och det visade sig funka om jag även definierar high men det hittade jag I ett kodexempel I Gadre’s bok. Jag har inte hittat någonting om detta varken i kretsens datablad eller i utvecklingssystemets dokumentation.
Ska det vara så här? Är det medfött att veta hur man t ex definierar en stackpekare???
Och erixon, den här 4096 MHz AVR-en vill jag ogärna göra mej av med för den kostar hela 17000 spänn…
Hälsningar
Harald
Var har ni lärt er detta? Jag har tidigare jobbat med stordatorer t ex IBM och för dessa finns alltid fullständiga manualer med ett eller flera exempel på ALLT. Dessutom har de ständig telefonsupport.
Det första försöket jag gjorde med 8515 var ett enkelt försök med rcall men det funkade ju inte. Man hoppade tillbaka till fel ställe efter utförd subrutin. Läste i instruktionsbeskrivningen men kom ingen vart. Skickade då mail till tillverkaren av AVR Studio och de svarade:
Hi,
You have to setup your stack pointer, like this:
ldi temp,low(RAMEND)
out SPL,temp
Please refer to the on-line help.
Regards,
-AVR technical support
och det visade sig funka om jag även definierar high men det hittade jag I ett kodexempel I Gadre’s bok. Jag har inte hittat någonting om detta varken i kretsens datablad eller i utvecklingssystemets dokumentation.
Ska det vara så här? Är det medfött att veta hur man t ex definierar en stackpekare???
Och erixon, den här 4096 MHz AVR-en vill jag ogärna göra mej av med för den kostar hela 17000 spänn…
Hälsningar
Harald
Nja kan hålla med om kan vara lite svårt att hitta i databladet
Exemplel (AT90S8515)
http://www.atmel.com/dyn/resources/prod ... OC0841.PDF
på sidan 21 finns en liten text som handlar om stackpekaren....
Man behöver inte sätta stack pekaren till RAMEND utan man kan setta den någon annan stans i ram minet...
Och det finns i kode exempel där de använder en AVR med RAM....
Men om du har fler frågor så är du alltigt välkommen att fråga här.
Exemplel (AT90S8515)
http://www.atmel.com/dyn/resources/prod ... OC0841.PDF
på sidan 21 finns en liten text som handlar om stackpekaren....
Man behöver inte sätta stack pekaren till RAMEND utan man kan setta den någon annan stans i ram minet...
Och det finns i kode exempel där de använder en AVR med RAM....
Men om du har fler frågor så är du alltigt välkommen att fråga här.

-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
Jag körde ”erixsons” kodexempel med följande kompletteringar.
Initierade PORTB efter initieringen av stackpekaren med denna kod:
ldi Temp,0b01100000 ;gör alla B till ingångar utom PB5 och PB6
out DDRB,Temp
Tänder en lysdion i main med denna kod:
sbi PORTB,5 ;sätter PORTB,5 = 1 dvs lysdiod tänds
Släcker samma lysdiod i timer1_m med denna kod:
cbi PORTB,5 ;gör PORTB,5 = 0 dvs lysdiod släcks
Får lysdioden att tändas men ej släckas.
Körde programmet i AVR 500-simulatorn och konstaterar att ”1” läggs ut på PORTB,5 men man kommer aldrig till subrutinen.
Provade ett program, intr_ex.asm, som finns på CD-skivan till boken
PROGRAMMING AND CUSTOMING THE AVR MICROCONTROLLER
av Dhananjay V. Gadre och kör det i AVR-simulatorn. Programmet funkar och TCNT1L stegas upp men inget händer när inställt värde uppnåtts.
Jag kör programmen i 8515
Något måste vara fel….
/Harald
Initierade PORTB efter initieringen av stackpekaren med denna kod:
ldi Temp,0b01100000 ;gör alla B till ingångar utom PB5 och PB6
out DDRB,Temp
Tänder en lysdion i main med denna kod:
sbi PORTB,5 ;sätter PORTB,5 = 1 dvs lysdiod tänds
Släcker samma lysdiod i timer1_m med denna kod:
cbi PORTB,5 ;gör PORTB,5 = 0 dvs lysdiod släcks
Får lysdioden att tändas men ej släckas.
Körde programmet i AVR 500-simulatorn och konstaterar att ”1” läggs ut på PORTB,5 men man kommer aldrig till subrutinen.
Provade ett program, intr_ex.asm, som finns på CD-skivan till boken
PROGRAMMING AND CUSTOMING THE AVR MICROCONTROLLER
av Dhananjay V. Gadre och kör det i AVR-simulatorn. Programmet funkar och TCNT1L stegas upp men inget händer när inställt värde uppnåtts.
Jag kör programmen i 8515
Något måste vara fel….
/Harald
Visst fan, det blev bara en blink… Logiskt fel alltså. Ändrade så att man togglar mellan tänd och släckt lysdiod men jag ser inte att det blir något avbrott ändå dvs man räknar upp TCNT1L men man kommer aldrig in i subrutinen. Man kan se detta i debuggern också. Märkligt att exemplet i boken har samma fel… Där skulle man anropa subrutinen var 20:e ms men inte heller där kommer man in i subrutinen…
/Harald
timer1_m:
;Interupt 1 gånger i sekunden
;gör något
dec Temp2
brne LED_ON ;Hoppa till LED_ON om <> 0
cbi PORTB,5 ;gör PORTB bit 5 = 0
rjmp timer1_slut
LED_ON:
sbi PORTB,5 ;gör PORTB bit 5 = 1
ldi Temp2,1
timer1_slut:
nop
;hoppar till baka
; rjmp test1 ;xx
reti
/Harald
timer1_m:
;Interupt 1 gånger i sekunden
;gör något
dec Temp2
brne LED_ON ;Hoppa till LED_ON om <> 0
cbi PORTB,5 ;gör PORTB bit 5 = 0
rjmp timer1_slut
LED_ON:
sbi PORTB,5 ;gör PORTB bit 5 = 1
ldi Temp2,1
timer1_slut:
nop
;hoppar till baka
; rjmp test1 ;xx
reti
Exemplet jag gjorde är för ATmega16
Du måste ändra en del saker om du vill använda AT90s8515
bland annat
.org 0x000C <= till 0x0004
rjmp timer1_m
ldi temp, 0x10 <= till 0x40
out TIMSK, temp
jag tror inte att det är något mer....
Jag skulle kunna testa men jag är lite stressad just nu så det får bli imorgon i så fall
hoppas att det har gett en förklaring
Du måste ändra en del saker om du vill använda AT90s8515
bland annat
.org 0x000C <= till 0x0004
rjmp timer1_m
ldi temp, 0x10 <= till 0x40
out TIMSK, temp
jag tror inte att det är något mer....
Jag skulle kunna testa men jag är lite stressad just nu så det får bli imorgon i så fall
hoppas att det har gett en förklaring

Hej igen erixon!
Nu funkar det både i debuggern och i 8515-kretsen! Det blir 30 blink/minut eftersom lysdioden tänds varannan sekund.
Jag borde förstås ha sagt att jag körde med 8515 men på sikt kommer jag att köra med Atmega16 eftersom 8515 kommer att utgå.
Nu har jag alltså en lösning för båda kretsarna. Jättebra och Tack!
Harald
Nu funkar det både i debuggern och i 8515-kretsen! Det blir 30 blink/minut eftersom lysdioden tänds varannan sekund.
Jag borde förstås ha sagt att jag körde med 8515 men på sikt kommer jag att köra med Atmega16 eftersom 8515 kommer att utgå.
Nu har jag alltså en lösning för båda kretsarna. Jättebra och Tack!
Harald
Hmm det låter skumt det funkar bra i AVR studio
Tja den här delar cpu frekvensen till räknaren 256 i det här fallet
ldi temp, 0x0C
out TCCR1B, temp
conter räknar upp till den här värdet (ser nu att det borde vara 15625 efter som nollan räknas åxo)
ldi temp, 0x3D
out OCR1AH, temp
ldi temp, 0x08
out OCR1AL, temp
Alla exemplerna har jag ut gått i från 4Mhz cpu klocka
Du får hör av dej om det inte fungerar jag kan inte komma på vad som skulle kunna vara fel....
Tja den här delar cpu frekvensen till räknaren 256 i det här fallet
ldi temp, 0x0C
out TCCR1B, temp
conter räknar upp till den här värdet (ser nu att det borde vara 15625 efter som nollan räknas åxo)
ldi temp, 0x3D
out OCR1AH, temp
ldi temp, 0x08
out OCR1AL, temp
Alla exemplerna har jag ut gått i från 4Mhz cpu klocka

Du får hör av dej om det inte fungerar jag kan inte komma på vad som skulle kunna vara fel....

Erixon,
om man kollar i AVR Studio så representeras register TIMSK, TIFR, TCCR1A OCH TCCR1B på olika sätt i 8515 och Atmega16.
I 8515 använder TIMSK bit 2-5, Atmega16 bit 3, 5-7
TIFR bit 2-5, resp. 3, 5-7
TCCR1A bit 0-7, resp. bit 0,1, 4-7
TCCR!B bit 0-4, 6,7 resp. 0-3, 6,7
De som inte används är väl grå utan kontur?
Skulle gärna vilja veta hur du kommit fram till att andra .org ska initieras med 0x0004 för 8515 och 0x000C för Atmega16 resp. 0x40 och 0x10 för TIMSK.
Är med på att OCR1AH och L bygger upp ett 16-bitarstal som i det här fallet är 15625.
Tiden blir mycket exakt 1 sek med 8515 med värdet 0x004 och 0x40
I Atmega16 blir tiden ca 3 sek med 0x000C och 0x10.
Jag kör med 4MHz cpu
Förstod du något av det här…?
/Harald
om man kollar i AVR Studio så representeras register TIMSK, TIFR, TCCR1A OCH TCCR1B på olika sätt i 8515 och Atmega16.
I 8515 använder TIMSK bit 2-5, Atmega16 bit 3, 5-7
TIFR bit 2-5, resp. 3, 5-7
TCCR1A bit 0-7, resp. bit 0,1, 4-7
TCCR!B bit 0-4, 6,7 resp. 0-3, 6,7
De som inte används är väl grå utan kontur?
Skulle gärna vilja veta hur du kommit fram till att andra .org ska initieras med 0x0004 för 8515 och 0x000C för Atmega16 resp. 0x40 och 0x10 för TIMSK.
Är med på att OCR1AH och L bygger upp ett 16-bitarstal som i det här fallet är 15625.
Tiden blir mycket exakt 1 sek med 8515 med värdet 0x004 och 0x40
I Atmega16 blir tiden ca 3 sek med 0x000C och 0x10.
Jag kör med 4MHz cpu
Förstod du något av det här…?
/Harald
Hej....
Var jag fick 0x000C var helt enkelt där för att cpu hoppar dit när ett interupt timmer Compare Match inträffar, Mer om vilka interupt har för olika platser i minnet kan man läsa på sidan 43 i databladet för ATmega16 http://www.atmel.com/dyn/resources/prod ... oc2466.pdf
Och för att enabla Compare Match interupt skriverman en 1 till bit 4 i timsk (se sidan 114) vilket inte är samma i 8515.
"Är med på att OCR1AH och L bygger upp ett 16-bitarstal som i det här fallet är 15625."
ja
"om man kollar i AVR Studio så representeras register TIMSK, TIFR, TCCR1A OCH TCCR1B på olika sätt i 8515 och Atmega16.
I 8515 använder TIMSK bit 2-5, Atmega16 bit 3, 5-7
TIFR bit 2-5, resp. 3, 5-7
TCCR1A bit 0-7, resp. bit 0,1, 4-7
TCCR!B bit 0-4, 6,7 resp. 0-3, 6,7
De som inte används är väl grå utan kontur? "
Vilken version kör du? (AVRStudio 3.XX eller 4.X)
I AVR Studio 4.X är det nämligen dela upp ett registret så att de olika bitarna så att de hör ihopp med de olika "hårdvara", de är då mörkt överstruket.
Om den är ljus grå så finns den inte...(gäller båda AVR studio)
När jag kommer hem ska jag testa att köra den code jag har gjort i AVR studio 3.xx för se om den ger annat resultat.....
Det ända jag kan komma på är att du kör med intern RC klockan istället för kristallen...
Var jag fick 0x000C var helt enkelt där för att cpu hoppar dit när ett interupt timmer Compare Match inträffar, Mer om vilka interupt har för olika platser i minnet kan man läsa på sidan 43 i databladet för ATmega16 http://www.atmel.com/dyn/resources/prod ... oc2466.pdf
Och för att enabla Compare Match interupt skriverman en 1 till bit 4 i timsk (se sidan 114) vilket inte är samma i 8515.
"Är med på att OCR1AH och L bygger upp ett 16-bitarstal som i det här fallet är 15625."
ja
"om man kollar i AVR Studio så representeras register TIMSK, TIFR, TCCR1A OCH TCCR1B på olika sätt i 8515 och Atmega16.
I 8515 använder TIMSK bit 2-5, Atmega16 bit 3, 5-7
TIFR bit 2-5, resp. 3, 5-7
TCCR1A bit 0-7, resp. bit 0,1, 4-7
TCCR!B bit 0-4, 6,7 resp. 0-3, 6,7
De som inte används är väl grå utan kontur? "
Vilken version kör du? (AVRStudio 3.XX eller 4.X)
I AVR Studio 4.X är det nämligen dela upp ett registret så att de olika bitarna så att de hör ihopp med de olika "hårdvara", de är då mörkt överstruket.
Om den är ljus grå så finns den inte...(gäller båda AVR studio)
När jag kommer hem ska jag testa att köra den code jag har gjort i AVR studio 3.xx för se om den ger annat resultat.....
Det ända jag kan komma på är att du kör med intern RC klockan istället för kristallen...