Sida 2 av 4

Postat: 5 januari 2006, 15:58:54
av MicaelKarlsson
Är det vad den gör du vill veta?

Ser ut som den aktiverar Pin 1, sedap pin 2, så pin 3 upp till 8 och så pin 1, pin 2 ....... i en "oändlighetsloop"

PORTB = num[j]; //num[1] -> PORTB=0x02; = aktiverar pin 2 (eller pin 1 om du räknar 0-7)


Någon form av rinnande ljus.

Postat: 5 januari 2006, 16:03:32
av cykze
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>

Postat: 5 januari 2006, 16:12:29
av sodjan
exos, jag vill bara kolla...

Det låter som om du har letat i databladet för att kolla upp något i C-koden.
Jag är inte helt säker, men datablad för processorer brukar inte
ha med C specifika detaljer. Men, deet är ju ionte helt tydligt
vad du har letat efter, så jag vet inte...

Postat: 5 januari 2006, 16:26:55
av exos
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...

Postat: 5 januari 2006, 16:28:34
av karlstedt
Jag får en känsla av att han letar efter om {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 } kommer "träffa" rätt pinnar. Jag skulle vilja att det saknas en grundläggande förståelse för mikrokontrollers.... och kanske det (hexadecimala talsystemet) just nu.

Det kommer exos ;)


EDIT: För sen...

Postat: 5 januari 2006, 16:53:52
av exos
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

Postat: 5 januari 2006, 17:07:54
av karlstedt
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.

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
Det är således lättast att se i det binära talsystemet vilken pinne man "pekar" på.

Postat: 5 januari 2006, 17:14:48
av exos
jaha... då hajar ja.... bugar o bockar....

Postat: 5 januari 2006, 17:18:24
av Kaggen
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

Postat: 5 januari 2006, 20:02:39
av björn
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
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.

Postat: 6 januari 2006, 14:07:46
av chucktraynor
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?
MicaelKarlsson skrev:Är det hela koden? Du måste ju ange vilken AVR det gäller...



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

Postat: 6 januari 2006, 14:24:16
av JimmyAndersson
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.

Postat: 7 januari 2006, 01:25:34
av exos
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?

Postat: 7 januari 2006, 02:49:52
av cykze
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".

Postat: 7 januari 2006, 03:16:45
av exos
nåt sånt här då?

Kod: Markera allt

sbis r16, PinB
sbis PinB, 7
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

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