Fråga ang C kod
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
När det gäller DDRx, PORTx och PINx ligger bitarna på samma ställe i alla AVR-modeller, så den biten är rätt.
Däremot är inte pinnarna på PortB satta som utgångar. Det gör du genom att innan while-loopen lägga in "DDRB = 0xFF;".
Sen är den där delay-metoden lite dålig. Beroende på hur kompilatorn optimerar kan det antingen bli som koden är tänkt att fungera eller att all delay-koden helt enkelt optimeras bort, eller någonting där i mellan. Du kan deklarera 'i' som volatile ("volatile unsigned int i;") för att loopen inte ska optimeras bort iaf. Hur det kan bli med anropet till wait() vet jag inte riktigt, men var beredd på att delay:en kan bli lite väl kort.
Det är bättre att använda _delay_loop_1(), _delay_loop_2(), _delay_us() eller _delay_ms() för att generera delays istället. Du kan behöva lägga till dom här raderna högst upp i din C-fil också:
(4000000 är AVR:ens klockfrekvens)
#define F_CPU 4000000
#include <avr/delay.h>
Däremot är inte pinnarna på PortB satta som utgångar. Det gör du genom att innan while-loopen lägga in "DDRB = 0xFF;".
Sen är den där delay-metoden lite dålig. Beroende på hur kompilatorn optimerar kan det antingen bli som koden är tänkt att fungera eller att all delay-koden helt enkelt optimeras bort, eller någonting där i mellan. Du kan deklarera 'i' som volatile ("volatile unsigned int i;") för att loopen inte ska optimeras bort iaf. Hur det kan bli med anropet till wait() vet jag inte riktigt, men var beredd på att delay:en kan bli lite väl kort.
Det är bättre att använda _delay_loop_1(), _delay_loop_2(), _delay_us() eller _delay_ms() för att generera delays istället. Du kan behöva lägga till dom här raderna högst upp i din C-fil också:
(4000000 är AVR:ens klockfrekvens)
#define F_CPU 4000000
#include <avr/delay.h>
Senast redigerad av cykze 5 januari 2006, 16:14:30, redigerad totalt 1 gång.
ok... Jo jag vet vad koden gör men jag visste inte om "adresserna(?)" på pinnarna va rätt
char const num[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
men då är det så att 0x01 = Pin0..
men jag undra om det typ fanns nån "tabell" på detta så man ser vilka pinnar som är vad, det va det jag letade efter i databladet...
char const num[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
men då är det så att 0x01 = Pin0..
men jag undra om det typ fanns nån "tabell" på detta så man ser vilka pinnar som är vad, det va det jag letade efter i databladet...
att det saknar kunskaper, absolut 
fick igång min programerare igår. så idag har ja suttit på alla möjliga sidor ang AVR.... men jag skall köpa mig nån bra bok om AVR... hittar inte så jätte mkt C kod på AVR men det finns väl är "ute" nånstans.
skulle du kunna förklara lite snabbt vad 0x01 t.ex står för då? typ

fick igång min programerare igår. så idag har ja suttit på alla möjliga sidor ang AVR.... men jag skall köpa mig nån bra bok om AVR... hittar inte så jätte mkt C kod på AVR men det finns väl är "ute" nånstans.
skulle du kunna förklara lite snabbt vad 0x01 t.ex står för då? typ
Just nu skulle jag tro att du tror att {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 } är något speciellt för mikrokontrollers. Men så är det inte. Det är bara ett sätt att representera ett tal.
här är en tabell som visar lite mer överskådligt.
Det är således lättast att se i det binära talsystemet vilken pinne man "pekar" på.
här är en tabell som visar lite mer överskådligt.
Kod: Markera allt
hex dec bin
0x00 = 0 = 00000000
0x01 = 1 = 00000001
0x02 = 2 = 00000010
0x04 = 4 = 00000100
0x08 = 8 = 00001000
0x10 = 16 = 00010000
0x20 = 32 = 00100000
0x40 = 64 = 01000000
0x80 = 128 = 10000000
Skall du programmera microkontrollers så bör du kunna hexadecimala och binära talsystemet och omvandlingar däremellan.
Siffror i hexadecimala talsystemet skrivs oftast med inledande 0x som t.ex. 0x01 som är samma som 1 decimalt eller 0x10 som är samma som 16 decimalt.
Efter lite Googel så hittade jag dessa:
http://user.it.uu.se/~jesperw/se/qna/talsystem.shtml
http://www.math.chalmers.se/~thomas/NAN/FAQ/bytes.html
Det du också bör lära dig angående programmering generellt är bitvisa operatorer som AND, OR, XOR för att kunna maska ut bitar m.m. Dessutom ren programmeringslogik (IF, THEN, ELSE... m.fl.) och hur du utför liknande villkor i assembler.
Mats
Siffror i hexadecimala talsystemet skrivs oftast med inledande 0x som t.ex. 0x01 som är samma som 1 decimalt eller 0x10 som är samma som 16 decimalt.
Efter lite Googel så hittade jag dessa:
http://user.it.uu.se/~jesperw/se/qna/talsystem.shtml
http://www.math.chalmers.se/~thomas/NAN/FAQ/bytes.html
Det du också bör lära dig angående programmering generellt är bitvisa operatorer som AND, OR, XOR för att kunna maska ut bitar m.m. Dessutom ren programmeringslogik (IF, THEN, ELSE... m.fl.) och hur du utför liknande villkor i assembler.
Mats
Läs på lite om C-programmering i allmänhet, att hitta förklaringar av C-syntax i uc sammanhang är nog bara att glömma iom att viss kunskap i C tas ganska förgivet.exos skrev:att det saknar kunskaper, absolut ;)
fick igång min programerare igår. så idag har ja suttit på alla möjliga sidor ang AVR.... men jag skall köpa mig nån bra bok om AVR... hittar inte så jätte mkt C kod på AVR men det finns väl är "ute" nånstans.
skulle du kunna förklara lite snabbt vad 0x01 t.ex står för då? typ
-
- Inlägg: 3
- Blev medlem: 6 januari 2006, 13:55:42
Jag som är grön på elektronik förstår inte hur strömbrytaren i schemat nedan kan styra om lysdioden lyser.
Enda förklaringen jag kan komma på är att PD0 är ingång för ström och PD1 är utgång och därmed får lysdioden ström när brytaren sluts?
Enda förklaringen jag kan komma på är att PD0 är ingång för ström och PD1 är utgång och därmed får lysdioden ström när brytaren sluts?
MicaelKarlsson skrev:Är det hela koden? Du måste ju ange vilken AVR det gäller...
Så här skulle jag göra!
OBS!!
- Jag använde Tiny28
- Ingen avkoppling på spänningsmatningen med mera, med mera....
EDIT: Läs databladet!!!
EDIT 2: Kopplingsschemat ovan är under förutsättning att din AVR kan driva 20 mA på en I/O-pinne. Jag har dessutom inte testa kopplingen men den bör fungera.
- JimmyAndersson
- Inlägg: 26579
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Nu har jag inte pysslat med AVR-processorer, men generellt sätt så fungerar det så att man (med programmet man skriver) kan välja om en "pinne" ska vara ingång eller utgång. I detta fallet är PD0 satt som ingång och PD1 som utgång. Sedan låter man programmet kolla om det blir signal på PD0 och då skicka ut signal på PD1.
Enkelt förklarat, men så går det till.
Enkelt förklarat, men så går det till.
Gäller Assembler.
en fråga för att läsa på ett visst ben på AVR´n vad skriver man då... har läst igenom allt på som står på http://www.avr-asm-tutorial.net/avr_en/
verkar som om man skall använda sig av kommandort "IN" ?
IN portB,3 ? <-- så eller?
en fråga för att läsa på ett visst ben på AVR´n vad skriver man då... har läst igenom allt på som står på http://www.avr-asm-tutorial.net/avr_en/
verkar som om man skall använda sig av kommandort "IN" ?
IN portB,3 ? <-- så eller?
Det är PINB du ska läsa från, inte PORTB. Läs om port-registrena (DDRn, PORTn och PINn) i databladet.
Kolla upp instruktionerna SBIC och SBIS i AVR Instruction Set.
Kolla på också på http://www.avrbeginners.net/ under "AVR Architecture->I/O Ports".
Kolla upp instruktionerna SBIC och SBIS i AVR Instruction Set.
Kolla på också på http://www.avrbeginners.net/ under "AVR Architecture->I/O Ports".
nåt sånt här då?
det gäller schemat som jag gjorde innan,
den skall alltså utföra en del av koden när knappen är har blivit nertryckt en gång, alltså inte när den hålls ner utan en kapptryckning, så skall den skriva koden som tänder LED´n, trycker man igen slocknar den...
Jag e mer bekat med IF, Then, Else efter hemsidor asp, lite php
IF PinB7 = true then
portB3 = true
end if
edit:
Kan man göra nåt sånthär kanske?
Kod: Markera allt
sbis r16, PinB
sbis PinB, 7
den skall alltså utföra en del av koden när knappen är har blivit nertryckt en gång, alltså inte när den hålls ner utan en kapptryckning, så skall den skriva koden som tänder LED´n, trycker man igen slocknar den...
Jag e mer bekat med IF, Then, Else efter hemsidor asp, lite php
IF PinB7 = true then
portB3 = true
end if
edit:
Kan man göra nåt sånthär kanske?
Kod: Markera allt
LOOP:
rcall LEDOFF
rcall LEDON
rcall KNAPP
rjmp LOOP
LEDON:
sbi r16, PortB
sbi PortB, 3
LEDOFF:
cbi r16, PortB
cbi Port, 3
KNAPP:
sbis r16, PinB
sbis PinB, 5