Läsa in seriell information... [AVR]
Okej, då hänger jag med.
Frågan är nu hur jag ska spara all inkommande information i SRAM och kunna hålla isär allt jag stoppar in.
Micke_s gav mig lite tips, men jag hängde inte riktigt med.
Är det inte dumt att skriva till eeprom minnet efter varje byte som man tar emot. Hinner skrivningen klart innan nästa byte kommer?
Frågan är nu hur jag ska spara all inkommande information i SRAM och kunna hålla isär allt jag stoppar in.
Micke_s gav mig lite tips, men jag hängde inte riktigt med.
Är det inte dumt att skriva till eeprom minnet efter varje byte som man tar emot. Hinner skrivningen klart innan nästa byte kommer?
Det är nog bäst att spara informationen först och sedan
skriva den till EEPROM i lugn och ro.
> och kunna hålla isär allt jag stoppar in.
En buffert och ett par (eller en kanske räcker) "pekare" som håller reda
på var du är i bufferten. Bufferten är inget annan än en viss mångd SRAM
som du har reserverat för just det. Pekaren är ett register (eller en annan
plats i SRAM) som håller reda på adressen till nästa lediga plats i bufferten.
> Hinner skrivningen klart innan nästa byte kommer?
Det kan nog igen här svara på, eftersom du inte har sagt vilken
hastighet (baud rate) som datat kommer in med. Du får räkna på det.
Men för att ge dig ett litet exempel. Säg att du kör med 9.600 baud (bit/sek).
Då får du in *ca* 1000 tecken/sek.
En skrivning till EEPROM brukar normalt ta 5-10 ms.
Alltså hinner du inte med...
skriva den till EEPROM i lugn och ro.
> och kunna hålla isär allt jag stoppar in.
En buffert och ett par (eller en kanske räcker) "pekare" som håller reda
på var du är i bufferten. Bufferten är inget annan än en viss mångd SRAM
som du har reserverat för just det. Pekaren är ett register (eller en annan
plats i SRAM) som håller reda på adressen till nästa lediga plats i bufferten.
> Hinner skrivningen klart innan nästa byte kommer?
Det kan nog igen här svara på, eftersom du inte har sagt vilken
hastighet (baud rate) som datat kommer in med. Du får räkna på det.
Men för att ge dig ett litet exempel. Säg att du kör med 9.600 baud (bit/sek).
Då får du in *ca* 1000 tecken/sek.
En skrivning till EEPROM brukar normalt ta 5-10 ms.
Alltså hinner du inte med...
Jag tror att du skulle behöva en enkel och bra bok på svenska om hur du programmerar en AVR. Vad jag förstår på dina frågor så behöver du lära dig lite grundkunskaper.
Per Foyer "Mikroprocessorteknik" är vad du ska läsa. Den tar upp detaljerat och med många bra exempel hur du sja börja med programmering av AVR-processorer.
Recension av boken:
Per Foyer "Mikroprocessorteknik" är vad du ska läsa. Den tar upp detaljerat och med många bra exempel hur du sja börja med programmering av AVR-processorer.
Recension av boken:
Lär dig allt om AVR-programmering (Betyg 5 av 5)
» Jens Hallgren
En mycket pedagogisk och lättläst bok om hur man programmerar AVR microcontrollers - med massor av exempel. Författaren går noggrannt igenom alla de viktiga funktioner i processorn man behöver förstå för att kunna skriva avancerade program i assembler. Bla om CPU-register, Beräkningar, Bitmanipulering, I/O-Portar, Minneshantering (lagring av data på SRAM och EEPROM, läsning från programminnet), Avbrottshantering (interrupt), Inbyggd Timer, Datakommunikation (UART), Hårdvarudesign, Programmering av processorn med AVR Studio 4 mm...
Vad är det för bok?Fagge skrev:Kan detta vara till någon hjälp?.
http://uppmedbilden.com/out.php/i1758_IMG4065.JPG Full Storlek
I de flesta AVR-processorerna finns det tre speciella 16-bitars register som heter X,Y och Z som används som pekare när man ska skriva/läsa i SRAM, EEPROM eller FLASH-minnet. Dessa tre består egentligen av 6 st 8-bitars register, nämligen r26-r31 och måste definieras först:
och eftersom processorn bara arbetar med 8 bitar åt gången måste man ladda dessa individuellt:
sedan använder du dessa instruktioner: (r1 kan vara vilket register som helst mellan r1-r29. r30 och r31 är ju upptagna av Z)
tänk på att övre delen av ramminnet används av stacken (dvs när du gör rcall/ret eller pop/push , stackpekaren måste initieras innan dessa instruktioner fungerar, t.ex.
Kod: Markera allt
.DEF ZL = r30
.DEF ZH = r31
Kod: Markera allt
.EQU minnesadress = SRAM_START ; exemplet använder sig av ramminnet.
ldi ZL,low(minnesadress)
ldi ZH,high(minnesadress)
Kod: Markera allt
ld r1,Z ; läs data från ram till register r1(en byte)
st Z,r1 ; spara data i r1 till sram (en byte)
ld r1,Z+ ; läs dara från minnesposition (Z) till r1, öka sedan Z med ett
st Z+,r1 ; spara data i minnet (Y) och öka Y med ett
ld r1,-Y ; minska värdet i Y med ett, läs sedan data från den nya minnesadressen.
Kod: Markera allt
ldi r16,low(RAMEND) ; läs in SRAM-minnets högsta adress, låga byten i r16
out SPL,r16 ; skicka till stackpekaren, låg byte
ldi r16,high(RAMEND) ; läs in SRAM-minnets högsta adress, höga byten i r16
out SPH,r16 ; skicka till stackpekaren, hög byte