Läsa in seriell information... [AVR]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Snouser
Inlägg: 107
Blev medlem: 15 november 2006, 22:07:55
Ort: Göteborg

Inlägg av Snouser »

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Inlägg av jesse »

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:
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...
Mr M
Inlägg: 165
Blev medlem: 20 januari 2006, 21:35:14

Inlägg av Mr M »

Fagge skrev:Kan detta vara till någon hjälp?.

http://uppmedbilden.com/out.php/i1758_IMG4065.JPG Full Storlek

Bild
Vad är det för bok?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

Per Foyer "Mikroprocessorteknik"
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Inlägg av jesse »

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:

Kod: Markera allt

.DEF ZL = r30
.DEF ZH = r31
och eftersom processorn bara arbetar med 8 bitar åt gången måste man ladda dessa individuellt:

Kod: Markera allt

.EQU minnesadress = SRAM_START ; exemplet använder sig av ramminnet.
ldi ZL,low(minnesadress)
ldi ZH,high(minnesadress)
sedan använder du dessa instruktioner: (r1 kan vara vilket register som helst mellan r1-r29. r30 och r31 är ju upptagna av Z)

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.
 
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

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
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

"Dessa tre består egentligen av 6 st 8-bitars register, nämligen r26-r31 och måste definieras först"

Dom är definierade i include filen.

; ***** CPU REGISTER DEFINITIONS *****************************************
.def XH = r27
.def XL = r26
.def YH = r29
.def YL = r28
.def ZH = r31
.def ZL = r30
Skriv svar