Atmega at90usb

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Atmega at90usb

Inlägg av gripner »

Hej

Har kopplat en HW till en at90usb

Hårdvaran triggas igång genom att man skickar en 10us lång puls (0V) till den.
När detta händer går en annan pinne på hårdvaran 0V från default 5V. Den går tillbaka till 5V igen efter en viss tid. Denna tid vill jag mäta

Jag vill koppla in 3st av denna hårdvara. dvs skickar "startsignal" från D0 D1 D2 och tar emot på C0 C1 C2

så programmet behöver
Sätta PortD pin 0,1,2 som output hög.
Sätta PortC som input

Mitt egna lilla fulhack
DDRD=1; // Alla D portar output
DDRC=0; // alla C portar input

PORTD=1; // portd D0 (och alla andra ) satt till default hög

PORTD=0;
_delay_us(10);
PORTD=1;

Måste ju göra det lite snyggare i en funktion samt bearbeta varje pinne i port d resp c, inte alla som jag gör.

Någon som kan hjälpa till? Mot kostnad om så vad?

http://iteadstudio.com/store/index.php? ... cts_id=415
länk till hårdvaran
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: Atmega at90usb

Inlägg av eqlazer »

Till en början stämmer inte

Kod: Markera allt

DDRD=1; // Alla D portar output
DDRC=0; // alla C portar input
det sätter bara pin 0. Det ska istället vara:

Kod: Markera allt

DDRD=0xFF; // Alla D portar output
DDRC=0x00; // alla C portar input (0x00 för tydlighetens skull)
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Re: Atmega at90usb

Inlägg av gripner »

ingen?
Användarvisningsbild
swesysmgr
Inlägg: 14957
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Atmega at90usb

Inlägg av swesysmgr »

Jag hade använt en timer med interrupts och valfri digital IO-pinne för att generera startpulsen. För mottagande pulsen ta en ingång som genererar ett interrupt vid nivåändring som startar en timer när ingången går låg och stoppar den vid interrupt nr 2 när ingången går hög igen. Sen kan du läsa av pulslängden.

Är alla signaler rena och fina digitala från ultraljudsmodulen? Du kan behöva aktivera en intern pullup på ingången från ljudmodulen och välja en lagom prescaler för din timer relativt avstånden som skall mätas för att få bra upplösning på mätningen.

Jag har aldrig använt at90xx usb så jag får titta lite i databladet först för att kunna ge konkreta svar med kod.
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Re: Atmega at90usb

Inlägg av gripner »

gjort lite mer fulhack,
kommit så långt så att allt princip fungerar. Det som inte fungerar är en loop där jag vill kolla om C1 är 5V dvs 1:a

C1 är port c pinne1

PORTC == 1 fungerar ej, antar att det har att göra med att port C är en 8bitars buss och så som jag har skrivit är superfel.
så hur gämför jag pinne 1 i den 8 bitar stora C bussen mot 1 ?
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Atmega at90usb

Inlägg av snigelen »

Hej,

Du menar kanske PINC om du skall läsa från porten (som ingång)? PINC == 1 kollar om PC0 är hög och alla andra är låga.
Några exempel för att kolla om andra biten (PC1) är hög

Kod: Markera allt

if (PINC & 2)
   // PC1 is high

// Samma men kanske tydligare
if ((PINC & 2) != 0)

// I en annan stil
if ((PINC & (1<<PC1)) != 0) 

// Tydligast?
if (bit_is_set(PINC, PC1))
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Atmega at90usb

Inlägg av sodjan »

Jag fattar inte riktigt här...
Att läsa/testa en enstaka I/O pinne måste/borde vara en av de
mest grundläggande operationerna som en microcontroller kan utföra!
Hur kan det komma sig att det är några som helst frågetecken kring just det ?
Har dokumentationen missat en så pass fundamental funktion ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Atmega at90usb

Inlägg av jesse »

Hur noga ska du mäta tiden?
Du mäter en meter (tur och retur) på 5.88 ms.

Vill du ha 1dm upplösning behöver du kunna mäta ner till 0.58 ms.
Enklast (tror jag) är att du startar en timer som räknar upp.
Sedan ligger du i en loop och kollar om någon förändring sker på port C.

När det gör det så läser du av värdet på timern. och sparar det i en variabel beroende på vilken bit i port C som ändrades.

Om du vill ha 1 mm noggrannhet så hinner processorn köra 47 klockcykler under den tiden vid 8 MHz klocka. (har jag räknat rätt nu? :humm: )

Om timern kör på 1 MHz kan den räkna till 65536 på 0.065 sekunder vilket motsvarar en sträcka på 11 meter....
(sensorn har Maximal Range 1500 mm... )

EDIT: ändrade till 47 klockcykler...
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Re: Atmega at90usb

Inlägg av gripner »

Har nästan fått allt att fungera, funderar dock på om jag tolkat "manualen" till ultrasonic grejjen fel.

/16us triggersignal. svappa 5 v till 0 v 15us
PORTD=0;
_delay_us(15);
PORTD=1;
/detta fungerar

/whileloop som väntar på att PC0 skall gå låg
/fungerar

whileloop som väntar på att PC0 skall gå hög
i denna whileloop stegar jag up en variabel
Dock blir den variabeln alltid satt till 18 eller 19........
i min tanke skulle den variabeln bli olika stor beroende på antal varv whileloopen snurrar då vilkåret tar olika tid att uppfyllas.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Atmega at90usb

Inlägg av sodjan »

> PORTD=0;
> _delay_us(15);
> PORTD=1;
> /detta fungerar

Jo, kanske "fungerar", men det så klart fortfarande inte alla bra/snyggt.

Du sätter alla 8 I/O pinnarna i PORTD och du kan så klart inte
använda de övriga 7 till något annat. Det "fungerar" så länge som
du inte gör det, men kommer att få väldigt märkliga fenomen om
du senare lägger till en funktion på en annan PORTD-pinne utan att
tänka på just denna kod. Det finns ingen som helst anledning
att ta sådana där genvägar...
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Re: Atmega at90usb

Inlägg av gripner »

ingen som har lust att ta på sig "jobbet" ?'

Sitter fortfarande fast
Dummade ner koden för att bara testaultrasonic enheten

Kod: Markera allt

	while (1) {

		
		PORTD=0;
		_delay_us(15);
		PORTD=1;
		

		while(bit_is_set(PINC, PC0)) {
			// snurra tills PORTC == 0 DVS börja mäta tid
			tv++;
                         }

		itoa(tv, buffer, 10); // 10 - decimal;

	

		usb_serial_write((unsigned char *)buffer, sizeof(buffer)-1);


		tv=0;
		_delay_ms(65);
                }

Tanken är att enbart starta gnom att skicka en trigpuls, skall vara 10us minimum, jag kör 15us
sedan en whileloop som väntar på att PINC 0 skall gå låg, stegar up en variabel medan den väntar.
Kollar jag på ociloskåpet ser jag att PINC 0 GÅR LÅG någon ms, sedan går hög.
Problemet är att programet fastnar i while loopen, dvs även då pinc 0 går låg snurrar det vidare i loopen


edit: korrigerat till pinc 0
Senast redigerad av gripner 30 november 2011, 09:33:02, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Atmega at90usb

Inlägg av sodjan »

> while(bit_is_set(PINC, PC0))
> dvs även då pinc 1 går låg snurrar det vidare i loopen.

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

Re: Atmega at90usb

Inlägg av jesse »

>ingen som har lust att ta på sig "jobbet" ?'

jobb? Vi har kommit med diverse förslag och förklaringar.
Vi trodde att du ville göra jobbet. :)

>fastnar i loopen....

Har du konstaterat att meddelandet via USB går fram om du skickar data?
Innan du går in i "while (1)" så skicka en startkod till USB för att signalera att du börjar.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Atmega at90usb

Inlägg av snigelen »

Ett antal saker.

Du kan inte använda PC0, sitter det inte en kristall på den pinnen?

Du vill väl mäta hur länge pulsen är låg? Vänta i så fall tills den blir låg, börja därefter tidtagningen och mät tiden tills pinnen blir hög igen.

Att räkna upp en variabel är i regel inte bästa sättet att mäta tid. T.ex. är det väl en del avbrott involverade i USB-kommunikationen som gör att tidräkningen stannar när de hanteras. Bättre är att använda en timer på något vis. Bäst för att mäta pulslängder är input capture funktionen i timer1 men det finns bara en sådan enhet så då behöver dina ultraljudsenheter vara i tri-state-läge om de inte blivit triggade. Men det kanske de är? Men man kan använda en timer på fler sätt också.

Om usb_serial_write vill ha en sträng som argument vill du nog ha

Kod: Markera allt

usb_serial_write((unsigned char *)buffer, strlen(buffer));
dvs strlen() i stället för sizeof(), annars får du med en massa skräp.

Edit: Jag missupfattade visst att man skulle mäta längden på svarspulsen, det är ju tiden från triggpuls till svarspuls som skall mätas.
Senast redigerad av snigelen 30 november 2011, 10:37:19, redigerad totalt 1 gång.
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Re: Atmega at90usb

Inlägg av gripner »

Har testat lite till, mina tankar från igår verkar stämma.
När jag kollade på skåpet såg jag att ECHO pulsen oberoende av längd till objekt var SAMMA!!! där emot började ECHO pulsen vandra höger/vänster på skåpet när jag ändrade avstånd till objektet.

Vad jag förstår från manual, skall enheten triggas, sedan väntar man på echo puls som man mäter duration på, den duration = avstån via ltid * ljudetshastighet/2 eller så.

Nu gör jag som så att jag istället mäter tiden från att jag skickar min trigger till att ECHO pulsen går på (PINC0 går0)
Funkar! Denna tid ändras så fort jag flyttar objektet!

Jobb, nej jag vill inte göra jobbet. Jag bara gör en proof of concept om uc+ultraljud enheten kan göra vad jag skall göra.
Sedan ser jag gärna att någon som programerar uc mer ofta än vart 10:e år skriver programet enligt min spec. Så det inte blir ett fulhack som fungerar.
Skriv svar