Noggranna sekunder i stället för RTC...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

henkebenke> "Ja, kilo betyder i detta fall 1024. Tack för förtydligandet."

Sen när betydde 32,7680 kHz != 32,7680 *1024 Hz? Det är helt vanliga Kilo Herts.
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

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
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

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. :)
danei
EF Sponsor
Inlägg: 27419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

[quote="RDX*"]henkebenke> "Ja, kilo betyder i detta fall 1024. Tack för förtydligandet."

Sen när betydde 32,7680 kHz != 32,7680 *1024 Hz? Det är helt vanliga Kilo Herts.[/quote]

Han menade att 32KHz betydde 32768Hz
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Precis, klockkristaller på 32.768 kHz brukar kallas för 32kHz. Eftersom de är jämnt delbara till 1Hz med 2^15=32768=32k.
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

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
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Main körs hella tiden vilket gör att man inte ser "blinket" efter som lysdioden är släkt i ca 4 klockcycker

jag skulle tro det är därför du inte får det att fungera som du hade förväntat.... :)
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av 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
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

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 :)
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

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
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

Erixon!

Nu har jag gått över till Atmega16 och det funkar men tiden blir tydligen 3 sek. fast jag vill ha 1 sek.
Jag har inte fördjupat mej i koden. Kan du säga vad det är som styr vilken tid det blir?

/Harald
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

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.... :?
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

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
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

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...
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Gav samma resultat med AVR Studio 3.XX (oväntat :roll: )

Men skulle tippa på att du använder den interna RC klockan den på som default men kolla på sidan 22 och ned över i data bladet...
Man ställer in det i "programeraren" (fuse bits)

hoppas det hjälpte :)
Skriv svar