Hur ska jag komma igång?
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Re: Hur ska jag komma igång?
Tiny 2313 och 461 har Usart, men det kanske du inte beställde några?
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
Vad braUART är inte så väldigt krångligt att göra med mjukvara heller, så det spelar inte så stor roll.

Jag hittade faktiskt den igår helt själv :O. Håller på att läsa den där nybörjarguiden. Kan bara säga att jag blir mer och mer taggad för detta för varje radEn bra sida om AVR assembler: AVR Assembler Tutorial Learning AVR Assembler with practical examples.


Re: Hur ska jag komma igång?
Det är lätt att vara efterklok...
Just UART-funktionen är mycket vanlig på snart sagt alla mikroprocessorer (µC), vara sig det är PIC, AVR eller andra. Såklart har vissa skrapade modeller inte denna funktion (och sannolikt saknas andra saker) men ska man experimentera och inte riktigt vet var gränsen går för ett experiment brukar jag att rekommendera att man tar i för kung och fosterland och beställer en "stor" krets med en gång, det är nämligen alltid enklare att stega neråt än uppåt när man börjar bli klar med projektet.
Programmeringen och verktyg är nästan alltid identiskt så det kan knappast vara där man har problem.
Sedan är jag lite anti-AVR, inte för att det är skit men för att de datablad jag har läst har varit röriga. Själva kretsarna är i grunden OK och varken bättre eller sämre än t.ex. PIC men just databladen är inte helt efter mitt tycke.
Och att man kan slå av ISP-funktionen ser jag som ett extremt fel... Googla på "bricked avr"...
Just UART-funktionen är mycket vanlig på snart sagt alla mikroprocessorer (µC), vara sig det är PIC, AVR eller andra. Såklart har vissa skrapade modeller inte denna funktion (och sannolikt saknas andra saker) men ska man experimentera och inte riktigt vet var gränsen går för ett experiment brukar jag att rekommendera att man tar i för kung och fosterland och beställer en "stor" krets med en gång, det är nämligen alltid enklare att stega neråt än uppåt när man börjar bli klar med projektet.
Programmeringen och verktyg är nästan alltid identiskt så det kan knappast vara där man har problem.
Sedan är jag lite anti-AVR, inte för att det är skit men för att de datablad jag har läst har varit röriga. Själva kretsarna är i grunden OK och varken bättre eller sämre än t.ex. PIC men just databladen är inte helt efter mitt tycke.
Och att man kan slå av ISP-funktionen ser jag som ett extremt fel... Googla på "bricked avr"...
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
Jag har inte fått grejerna än. Men de från elfa kom i allafall fram till utlämningsstället igår så jag borde kunna hämta dem idag
.
Hur som helst så har jag börjat programmera lite assembler. Jag har laddat ner atmeldtudio 6 och simulerar den däri.
Det är dock en grej jag inte förstår med kommandot "sbis".
Jag har skrivit koden:
Jag har även satt pin 0,1 och 2 på portB till 1. Dock så körs ändå det tredje kommandot. Jag tycker ju att inget av dessa borde köras i sådana fall? Vad tänker jag för fel.
Har sökt runt lite. Men hittar inget vettigt som jag förstår...

Hur som helst så har jag börjat programmera lite assembler. Jag har laddat ner atmeldtudio 6 och simulerar den däri.
Det är dock en grej jag inte förstår med kommandot "sbis".
Jag har skrivit koden:
Kod: Markera allt
sbis PINB,0b00000001 ;om pin 0 är noll hoppa över nästa rad
rcall Blink ;skicka till subrutinen Blink (som får lamporna att blinka)
sbis PINB,0b00000010 ;om pin 1 är noll hoppa över nästa rad
rcall TurnOn ;skicka till subrutinen TurnON (Tänder alla leds)
sbis PINB,0b00000100 ;om pin 2 är noll hoppa över nästa rad
rcall TurnOff ;skicka till subrutinen TurnOff (släcker alla leds)
Har sökt runt lite. Men hittar inget vettigt som jag förstår...
Re: Hur ska jag komma igång?
Har den aktuella pinnen på port B även analoga funktioner ?
Och i så fall, har du kollat om det behövs någon speciell
inititering för att stänga av det ?
Och i så fall, har du kollat om det behövs någon speciell
inititering för att stänga av det ?
Re: Hur ska jag komma igång?
Hej,
Du skall ange ett bitnummer mellan 0 och 7, inte en bitmask mellan 0 och 255.
sbis PINB,0b00000100 testar alltså bit 4, inte bit 2.
Du skall ange ett bitnummer mellan 0 och 7, inte en bitmask mellan 0 och 255.
sbis PINB,0b00000100 testar alltså bit 4, inte bit 2.
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
Ahha tack snigel. Nu insåg jag varför allt blev knas. Gjorde såhär och då funkar det:
Kod: Markera allt
sbic PINB,0x00 ;om pin 0 är noll hoppa över nästa rad
rcall Blink ;skicka till subrutinen Blink (som får lamporna att blinka)
sbic PINB,0x01 ;om pin 1 är noll hoppa över nästa rad
rcall TurnOn ;skicka till subrutinen TurnON (Tänder alla leds)
sbic PINB,0x02 ;om pin 2 är noll hoppa över nästa rad
rcall TurnOff ;skicka till subrutinen TurnON (Tänder alla leds)
Förstår inte riktigt vad du menar, eller hur jag ska kolla det. Men tror det. Det är en ATtiny26a i allafall.Har den aktuella pinnen på port B även analoga funktioner ?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Re: Hur ska jag komma igång?
> Har den aktuella pinnen på port B även analoga funktioner ?
> ... behövs någon speciell inititering för att stänga av det
Detta är PIC specifikt och gäller inte AVR.
> ... behövs någon speciell inititering för att stänga av det
Detta är PIC specifikt och gäller inte AVR.
Re: Hur ska jag komma igång?
> sbic PINB,0x00
Noll är alltid noll, finns ingen fördel/anledning att skriva så där.
Och det gäller för alla pinnar/bitar 0-7.
"sbic PINB, 0" är nog det normala sättet att skriva det på.
Se sidan 125 i detta dokument (det bör/måste du ha):
http://www.atmel.com/Images/doc0856.pdf
"8-bit AVR Instruction Set".
Eller "sbic PINB, PINB0", det finns normalt symboler för bitarna till
alla register. Spelar inte så stor roll för PINB kanske
, men t.ex
"SBI ADCSR, ADEN" säger ju mer än "SBI ADCSR, 7".
(ADEN = ADC enable)
Se också till att du hajar minnesmappen på en AVR, den är lite rörig.
Vissa instruktionern (t.ex just SBIS) fungerar bara mot vissa register o.s.v.
Om du kollar "Register Summary" på sidan 168 i databladet, så ser du att
just PINB ligger inom de lägsta 32 IO-adresserna (00-1F) där SBIS fungerar,
på de övriga registren i den mappen (med högre adresser) fungerar SBIS inte.
Man kan t.ex inte använda bit set/clear instruktioner för att konfigurera timers.
Noll är alltid noll, finns ingen fördel/anledning att skriva så där.
Och det gäller för alla pinnar/bitar 0-7.
"sbic PINB, 0" är nog det normala sättet att skriva det på.
Se sidan 125 i detta dokument (det bör/måste du ha):
http://www.atmel.com/Images/doc0856.pdf
"8-bit AVR Instruction Set".
Eller "sbic PINB, PINB0", det finns normalt symboler för bitarna till
alla register. Spelar inte så stor roll för PINB kanske

"SBI ADCSR, ADEN" säger ju mer än "SBI ADCSR, 7".
(ADEN = ADC enable)
Se också till att du hajar minnesmappen på en AVR, den är lite rörig.
Vissa instruktionern (t.ex just SBIS) fungerar bara mot vissa register o.s.v.
Om du kollar "Register Summary" på sidan 168 i databladet, så ser du att
just PINB ligger inom de lägsta 32 IO-adresserna (00-1F) där SBIS fungerar,
på de övriga registren i den mappen (med högre adresser) fungerar SBIS inte.
Man kan t.ex inte använda bit set/clear instruktioner för att konfigurera timers.
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
Tack för länken sodjan. Jag hade problem att hitta och förstå en hel del kommandon från guiden jag kollade på. Den där är ju riktigt bra att kolla i för att förstå kommandon osv.
Först tänkte jag att man angav exempelvis pin 3 med: 0b00001000. Sedan när han sa att man skulle ange själva värdet på utgången så tänkte jag att det är bättre att ange det i hexa än binärform eftersom man då slipper räkna så mycket. Tänkte inte att man bara kunde skriva 3. Eller PINB3
Sen vad menar du med minnesmappen? Jag kollade både i pdfn du länkade och i databladet för ATtiny26. I den du länkade finns det ingen register summary. I databladet finns det, men det står inte (00-1F) utan "adress: $16 ($36)" på pinB?
Först tänkte jag att man angav exempelvis pin 3 med: 0b00001000. Sedan när han sa att man skulle ange själva värdet på utgången så tänkte jag att det är bättre att ange det i hexa än binärform eftersom man då slipper räkna så mycket. Tänkte inte att man bara kunde skriva 3. Eller PINB3
Sen vad menar du med minnesmappen? Jag kollade både i pdfn du länkade och i databladet för ATtiny26. I den du länkade finns det ingen register summary. I databladet finns det, men det står inte (00-1F) utan "adress: $16 ($36)" på pinB?
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
Jag funderar lite över hur jag ska få dioderna att blinka en efter en. Alltså att alla är släkta och bara den första lyser. Alla är släkta och bara den andra lyser osv.
Jag tänkte att jag kunde skriva 8 stycken Branches som kollar om lampan innan lyser och om den gör det så släcker man lampan innan och tänder den lampan. Finns det något effektivare sätt. Har för mig att vi gjorde helt annorlunda i skolan. Något som var typ bara ett par rader men kommer inte alls ihåg hur och hittar inget på nätet
Jag tänkte att jag kunde skriva 8 stycken Branches som kollar om lampan innan lyser och om den gör det så släcker man lampan innan och tänder den lampan. Finns det något effektivare sätt. Har för mig att vi gjorde helt annorlunda i skolan. Något som var typ bara ett par rader men kommer inte alls ihåg hur och hittar inget på nätet

Re: Hur ska jag komma igång?
> att det är bättre att ange det i hexa än binärform eftersom man då slipper räkna så mycket.
Vad är det du ska "räkna"?
0-7 är 0-7 både decimalt och hexadecimelt.
(Binärt är onödigt att blanda in här.)
Men OK, jag vet inte så mycket om AVR, men jag kan läsa datablad...
> I den du länkade finns det ingen register summary.
Nej, eftersom jag länkade till instruktions dokumentationen, inte till databladet.
Instruktionerna gäller generellt för alla 8-bit AVR oberoende av modell (i princip).
Detaljerna för en viss processor finns i respektive datablad, inkl en "Register Summary"
och en "Instruction Set Summary". Detaljerna om instruktionerna finns i det generella
dokument som jag länkade till.
> men det står inte (00-1F) utan "adress: $16 ($36)" på pinB?
Först måste man hålla reda på skillnaden mellan "Register File", "I/O Memory",
"Data Adress Space" och RAM". Se fig 19 på sidan 17 i databladet.
Sedan får man se upp med instruktionerna, för t.ex SBIC så står det :
"This instruction tests a single bit in an I/O Register and...."
Alltså är den adress som anges i instruktionen en adress i "I/O Memory".
$16 för PINA är adressen i "I/O Memory". Denna adress är även mappad
till adress $36 i "Data Adress Space", se fig 19 igen. Det är därför det
står både $16 och $36 i tabellen. D.v.s att man kan komma åt PINA både
genom adress $16 med de instruktioner som adresserar "I/O Memory" och genom
adress $36 med de instruktioner som adresserar "Data Address Space" (knappast
troligt att man vill göra det, men det visar principen
).
Vissa instruktiner fungerar bara mot "I/O Memory", andra bara mot annat.
Jämför t.ex dessa två:
SBIC: Skip if Bit in I/O Register is Cleared
SBRC: Skip if Bit in Register Cleared
Två instruktioner som gör i princip samma sak, men den ena (SBRC) mot
"register", den andra (SBIC) mot "I/O register". Det kan bli väldigt
konstiga buggar om man råkar förväxla dessa två...
Notera också skillnaden mellan :
CBI/SBI: Clear/Set bit in I/O Register
SBIC/SBIS: Skip if Bit in I/O Register is Cleared/Set
Både dessa jobbar mot samma I/O register (0-31, 00-1F)
Det verkar ju logiskt att man kan sätta/cleara samma bitar som man även kan testa.
Men alltså bara mot halva I/O Memory!
Jämför detta med :
SBR/CBI: Clear/Set Bit in Register (enbart register 16-31 !)
SBRC/SBRS: Skip if Bit in Register is Cleared/Set (register 0-31...)
Man kan alltså testa bitar i alla 32 register man bara sätta/cleara bitar i de 16 översta!
> Jag funderar lite över hur jag ska få dioderna att blinka en efter en.
Läs på om rotate/shift instruktionerna.
Vad är det du ska "räkna"?

0-7 är 0-7 både decimalt och hexadecimelt.
(Binärt är onödigt att blanda in här.)
Men OK, jag vet inte så mycket om AVR, men jag kan läsa datablad...

> I den du länkade finns det ingen register summary.
Nej, eftersom jag länkade till instruktions dokumentationen, inte till databladet.
Instruktionerna gäller generellt för alla 8-bit AVR oberoende av modell (i princip).
Detaljerna för en viss processor finns i respektive datablad, inkl en "Register Summary"
och en "Instruction Set Summary". Detaljerna om instruktionerna finns i det generella
dokument som jag länkade till.
> men det står inte (00-1F) utan "adress: $16 ($36)" på pinB?
Först måste man hålla reda på skillnaden mellan "Register File", "I/O Memory",
"Data Adress Space" och RAM". Se fig 19 på sidan 17 i databladet.
Sedan får man se upp med instruktionerna, för t.ex SBIC så står det :
"This instruction tests a single bit in an I/O Register and...."
Alltså är den adress som anges i instruktionen en adress i "I/O Memory".
$16 för PINA är adressen i "I/O Memory". Denna adress är även mappad
till adress $36 i "Data Adress Space", se fig 19 igen. Det är därför det
står både $16 och $36 i tabellen. D.v.s att man kan komma åt PINA både
genom adress $16 med de instruktioner som adresserar "I/O Memory" och genom
adress $36 med de instruktioner som adresserar "Data Address Space" (knappast
troligt att man vill göra det, men det visar principen

Vissa instruktiner fungerar bara mot "I/O Memory", andra bara mot annat.
Jämför t.ex dessa två:
SBIC: Skip if Bit in I/O Register is Cleared
SBRC: Skip if Bit in Register Cleared
Två instruktioner som gör i princip samma sak, men den ena (SBRC) mot
"register", den andra (SBIC) mot "I/O register". Det kan bli väldigt
konstiga buggar om man råkar förväxla dessa två...

Notera också skillnaden mellan :
CBI/SBI: Clear/Set bit in I/O Register
SBIC/SBIS: Skip if Bit in I/O Register is Cleared/Set
Både dessa jobbar mot samma I/O register (0-31, 00-1F)
Det verkar ju logiskt att man kan sätta/cleara samma bitar som man även kan testa.
Men alltså bara mot halva I/O Memory!
Jämför detta med :
SBR/CBI: Clear/Set Bit in Register (enbart register 16-31 !)
SBRC/SBRS: Skip if Bit in Register is Cleared/Set (register 0-31...)
Man kan alltså testa bitar i alla 32 register man bara sätta/cleara bitar i de 16 översta!
> Jag funderar lite över hur jag ska få dioderna att blinka en efter en.
Läs på om rotate/shift instruktionerna.
-
- Inlägg: 54
- Blev medlem: 18 februari 2011, 20:00:34
Re: Hur ska jag komma igång?
ahha nu låssnade det lite:P. Tack för du orkade förklara allting
$16 är adressen i I/O-memory. Medan $36 är i data adress space
Sedan ska man även vara försiktig eftersom det finns olika kommandon som bara fungerar på vissa ställen. Man ska välja rätt kommando beroende på vart man jobbar... Exempelvis ska man använda SBIC om man som jag gjorde nu jobbade i I/O-registret. Om jag istället hade läst in värdet i ett register så hade jag behövt använda SBRC.
Well, jag antar att tiden du lade ner på att förklara detta för mig, kommer rädda mig från en hel del huvudvärk de närmsta dagarna
Jag fick även till det jag ville med rol

$16 är adressen i I/O-memory. Medan $36 är i data adress space
Sedan ska man även vara försiktig eftersom det finns olika kommandon som bara fungerar på vissa ställen. Man ska välja rätt kommando beroende på vart man jobbar... Exempelvis ska man använda SBIC om man som jag gjorde nu jobbade i I/O-registret. Om jag istället hade läst in värdet i ett register så hade jag behövt använda SBRC.
Well, jag antar att tiden du lade ner på att förklara detta för mig, kommer rädda mig från en hel del huvudvärk de närmsta dagarna

Jag fick även till det jag ville med rol

Senast redigerad av noshorning 9 juni 2012, 13:56:10, redigerad totalt 3 gånger.
Re: Hur ska jag komma igång?
Fint. 
Jag ser inget direkt fel i din omskrivning av det jag skrev. Ganska bra
att göra så (skriva om med egna ord), det ger en bra koll på att man
har hängt med...
Rent *personligen* tycker jag att 8-bit AVR arkitekturen är lite rörig och det
är för mycket uppdelat i olika slags register/minne/RAM med begränsningar för
vad man kan eller inte kan göra. En kompilator för t.ex C har ju så klart "lärt sig"
detta och döljer det för användaren/programmeraren.
Det finns andra mikrokontroller arkitiekturer som är lite "renare" i sin arkitektur där
man i princip kan göra allt mot allt. Alla instruktionet fungerar på samma sätt mot
allt minne. Det finns bara en slags "register", inte tre olika. Det finns bara en
gemensam minnesmapp (förutom den för programminne, men den tillkommer ju
även i AVR fallet som i alla Harward arkitekturer).
På en AVR kan man alltså, oavsett hur mycket minne den aktuella processorn har,
bara göra bit set/clear/test instruktioner mot en liten begränsad del av minnet.
I andra arkitekturer kan man göra det mot hela minnet (alla register). Allt minne
på en AVR utöver de lägsta 16/32 register kan man i princip enbart göra load/store
(LDx/STx) mot, inget annat. Ska man t.ex göra en ROL mot Data Space, så blir det
en sekvens med LD/ROL/ST (LOAD från Data Space till ett register, ROL på registret
och sedan en STORE tillbaka till Data Space). I andra arkitekturer gör man en "rotate"
(eller vilken annan operation som helst) direkt mot allt tillgängligt minne.
Man kommer aldrig att kunna programmera AVR i assembler om man inte har koll
på detta, så klart. Och efter ett tag så blir det nog naturligt också...

Jag ser inget direkt fel i din omskrivning av det jag skrev. Ganska bra
att göra så (skriva om med egna ord), det ger en bra koll på att man
har hängt med...

Rent *personligen* tycker jag att 8-bit AVR arkitekturen är lite rörig och det
är för mycket uppdelat i olika slags register/minne/RAM med begränsningar för
vad man kan eller inte kan göra. En kompilator för t.ex C har ju så klart "lärt sig"
detta och döljer det för användaren/programmeraren.
Det finns andra mikrokontroller arkitiekturer som är lite "renare" i sin arkitektur där
man i princip kan göra allt mot allt. Alla instruktionet fungerar på samma sätt mot
allt minne. Det finns bara en slags "register", inte tre olika. Det finns bara en
gemensam minnesmapp (förutom den för programminne, men den tillkommer ju
även i AVR fallet som i alla Harward arkitekturer).
På en AVR kan man alltså, oavsett hur mycket minne den aktuella processorn har,
bara göra bit set/clear/test instruktioner mot en liten begränsad del av minnet.
I andra arkitekturer kan man göra det mot hela minnet (alla register). Allt minne
på en AVR utöver de lägsta 16/32 register kan man i princip enbart göra load/store
(LDx/STx) mot, inget annat. Ska man t.ex göra en ROL mot Data Space, så blir det
en sekvens med LD/ROL/ST (LOAD från Data Space till ett register, ROL på registret
och sedan en STORE tillbaka till Data Space). I andra arkitekturer gör man en "rotate"
(eller vilken annan operation som helst) direkt mot allt tillgängligt minne.
Man kommer aldrig att kunna programmera AVR i assembler om man inte har koll
på detta, så klart. Och efter ett tag så blir det nog naturligt också...
