ATMega16 + USART +PC [LÖST]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Re: ATMega16 + USART +PC

Inlägg av exos »

Det va så jag gjorde när jag startade, men försökte mig på en switch sats, men det funkar ju inte med typ "case '49':" då den bara tar en siffra.
Men nu gjorde jag en IF sats, och se på fan! fungerar ju strålande!

La till i koden (på PC sidan) "SerialPort1.DiscardOutBuffer()" så nu skickar den inte fel heller, kändes som det hängde kvar random värden på linan, men nu fungerar det kanon.

Jag kör väldigt simpelt. :)

Bild


Funkar bra med en liten fläkt jag har, men kopplar jag in en större så svajar det lite, behöver boosta lite power, typ en kondensator?! eller?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ATMega16 + USART +PC

Inlägg av sodjan »

Ja, det saknas ju en hel del i schemat (som du inte heller nämner i texten).
Avkoppling, gate-motstånd, back-EMF-diod bl.a.
Vad betyder "svajar" mer konkret ? Vad är det för fenomen du ser ?
Användarvisningsbild
AndLi
Inlägg: 18302
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: ATMega16 + USART +PC

Inlägg av AndLi »

det ska vara
case 49:

eller

case '1':
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Re: ATMega16 + USART +PC

Inlägg av exos »

sodjan:

svajar, typ om jag kör på väldigt låg speed med den stora fläkten så hör man att den inte ligger konstant i samma hastighet, kopplade även in en LED och man såg att ljuset "svajade".
bytte jag ut fläkten till en modell mindre så låg hastigheten och ljuset konstant.

På den lilla fläkten står det (0.23A), och den stora (0,28A).


Avkoppling, gate-motstånd, back-EMF-diod bl.a. det är sånt här som jag är väldigt lost på!, och det är viktigt annars uppstår det en massa problem o störningar som man har märkt :/


AndLi:

Tack ;)
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Re: ATMega16 + USART +PC

Inlägg av exos »

Back again ;)

Håller på med att styra en kanal till.

Har en till fråga, vet inte riktigt hur jag skall skicka ut värdet för att den skall veta vilken fläkt jag vill styra.
Jag har gjort som så att jag har 2st fläktar, Första kallar jag "a" och den andra kallar jag "d".
Värde mellan 0 - 9 ( beroende på hastighet).

startar jag upp AVR'en och terminal och skickar..

a1 - så gör den som den skall, fläkt ett startar på låg speed.
Sen kan jag hålla på så upp till "a9" och sen ner igen.

samma gäller för fläkt "d".
d1,d2,d3... osv sen ner till noll igen och det fungerar.

Men, nu till det kluriga.
säg att jag skickar "a5" (fläkt "a" på halvfart) så gör den det.

skickar jag sen t.ex "d5" (fläkt "d" på halvfart) då ballar allt ur.

summa, man kan inte styra dom samtidigt då sturlar det ihop sig åt alla håll och kanter.

kod...

Kod: Markera allt

void PWMOutputCH1(uint8_t duty)
{
   OCR0=duty;
}


void PWMOutputCH4(uint8_t duty)
{
   OCR2=duty;
}


char USARTReadChar()
{
	
	
   //Wait untill a data is available

   while(!(UCSRA & (1<<RXC)))
   {
      //Do nothing
   }

   //Now USART has got data from host
   //and is available is buffer
	
   return UDR;
}



void main() {

char channel;
char data;
int outval;
int FanCH;

USARTInit(51);
InitPWM();


   //Do this forever

   while(1)
   {
   			//Läser vilken kanal det handlar om. a,b,c eller d
			FanCH = USARTReadChar();

		// 97 = 'a'
			if (FanCH==97)
			{
			//Gå till kanal a
			channel='a';
				
					
			}
		// 98 = 'b'
			else if (FanCH==98)
			{
			//Gå till kanal b
			channel='b';
							
					
			
			}
		// 99 = 'c'
			else if (FanCH==99)
			{
			//Gå till kanal c
			channel='c';
							
					

			}

		// 100 = 'd'
			else if (FanCH==100)
			{
			//Gå till kanal d
			channel='d';
							
				_delay_ms(100);	

			}
		  

		  data = USARTReadChar();
			
			
				if (data==48)
				{
				outval=0;
				
				}
				else if (data==49)
				{
				outval=30;
				}
					else if (data==50)
				{
				outval=130;
				}
					else if (data==51)
				{
				outval=160;
				}
					else if (data==52)
				{
				outval=190;
				}
					else if (data==53)
				{
				outval=210;
				}
					else if (data==54)
				{
				outval=225;
				}
					else if (data==55)
				{
				outval=235;
				}
					else if (data==56)
				{
				outval=245;
				}
					else if (data==57)
				{
				outval=255;
				}

				
							switch (channel)
							{
							case 'a':
								PWMOutputCH1(outval);
																
								break;
							case 'b':
								//PWMOutputCH2(outval);
							case 'c':
								//PWMOutputCH3(outval);
							case 'd':
								PWMOutputCH4(outval);
															
								break;

								return;
							}
		
		_delay_ms(100);
   }     
      
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ATMega16 + USART +PC

Inlägg av sodjan »

> säg att jag skickar "a5" (fläkt "a" på halvfart) så gör den det.
> skickar jag sen t.ex "d5" (fläkt "d" på halvfart) då ballar allt ur.

Fel i koden i AVR'en. Bara att felsöka och rätta.

Din logik i koden är lite underlig. Läs en hel sekvens först
och kolla kanal/värde sen. Nu ser det ut som att du läser
ett tecken från UART och direkt kollar "kanal", men det kan
ju vara "värde" som du har läst. Som det är nu så kommer det
hela att bli helt fel om du hamnar ett tecken fel i sekvensen.

Du borde även lägga till något som indikerar start och stopp
på varje "paket" med kanal/värde. Eller i alla fall avsluta med
något känt, CR är aldrig fel.

D.v.s att du behöver inte köra dina if/elseif/endif loppar alls innan
du har en komplett uppsättning med kanal/värde. Innan dess kan
du bara spara under värderna så länge.
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Re: ATMega16 + USART +PC

Inlägg av exos »

Försöker som du sa Sodjan, men är det går sådär...men jag jobbar på.

Men en sak som jag ser ju är att den skickar hela tiden, efter man har skickat t.ex "a5"

Här skickade jag "a5" efter det "d5", sen stängde av dom med "d0" och "a0"...
men som sagt, första tecknet skickas en gång, sen skickas det sissta hela tiden tills man matar in nåt nytt.
Tänkte att man efter har skickat, så går den igenom koden, och på slutet "tömmer" värdet då det bara blir "a5" en gång.

Kod: Markera allt

a
55555555555555555555d
55555555555555555555555555555555555555555555555555555555555555555555555555d
000000000000000a

Mottaget från terminalen.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: ATMega16 + USART +PC

Inlägg av PHermansson »

Håller faktiskt på med nått liknande. Min tanke är att skicka paket med fasta längder, tex 10 byte. Allt läses in i en char, sedan tolkas resultatet. Första byten är en siffra mellan 0-9 som visar vilken AVR som ska använda resten av de data som skickas (ska sitta flera på en RS485-buss). Därefter ska det följa bytes som indikerar vad som ska göras, tex läsa en temperatur eller skriva text på en lcd. Sista byten som tas emot måste vara ett "Q", annars anses paketet ogiltigt.
Koden är dock inte klar, det är inte helt enkelt om allt ska bli rätt. Man måste ju även ta hänsyn till vad som händer om ett halvt paket kommer in, jag använder Watchdog med interrupt för detta. Har inte alla tio byte anlänt inom typ en sekund så skickas ett felmeddelande till datorn som då ska sända om.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ATMega16 + USART +PC

Inlägg av sodjan »

En sak bara, försök att vara tydlig och exakt när du beskriver något.
Undvik uttryck som t.ex "den" om det inte är 100% tydligt vad "den" syftar på.
T.ex :

> Men en sak som jag ser ju är att den skickar hela tiden, efter man har skickat t.ex "a5"

Vad är "den" som "skickar hela tiden" mer specifikt ?

> Här skickade jag "a5" efter det "d5", sen stängde av dom med "d0" och "a0"...

Varifrån ? Är det din PC applikation du syftar på här ?
D.v.s, vem (eller vad) är "jag"? Är det din PC-applikation ?

> första tecknet skickas en gång, sen skickas det sissta hela tiden tills man matar in nåt nytt.

Hur är det verifierat ? Var läser du av vad som skickas ?

> Tänkte att man efter har skickat, så går den igenom koden, och på slutet "tömmer" värdet då det bara blir "a5" en gång.

Du menar i AVR'en ? Problemet är (om jag förstår din kod rätt) att om du en gång tappar ett
tecken, så kommer din kod att ligga i fel fas med sändaren, i alla fall tills man tappar
ett tecken till och kommer tillbaka i rätt fas igen. Vad är det som skulle "tömmas" ?

> Mottaget från terminalen.

Vad är "terminalen" och var är det skickat ifrån ?

En annan sak, du har "_delay_ms(100)" på ett par ställen i koden. Om det körs
under tiden som överföring pågår, så kan du inte köra snabbare än ca 100 baud
utan att tappa tecken (du borde få "overflow" i AVR'en, men jag vet inte om du
testar för det). Varför har du den delay'en där ?
Mindmapper
Inlägg: 7121
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Re: ATMega16 + USART +PC

Inlägg av Mindmapper »

exos skrev:sodjan:

svajar, typ om jag kör på väldigt låg speed med den stora fläkten så hör man att den inte ligger konstant i samma hastighet, kopplade även in en LED och man såg att ljuset "svajade".
bytte jag ut fläkten till en modell mindre så låg hastigheten och ljuset konstant.
Vill du undvika svajet får du göra en mera avancerad styrning, en reglering av varvtalet.
Nu skickar du bara ut en spänning till fläkten och hoppas att den går som den ska. Nu fungerar olika motorer mer eller mindre bra, speciellt på lågvarv. Om det blir så att motorn inte går igång kommer den förmodligen att brinna upp med din konstruktion.

Du kan likna det vid när du kör bil. Trycker du bara ner gasen och försöker hålla hastigheten konstant genom att hålla ett läge på gasen, blir det inte så exakt. Använder du en farthållare blir det bättre. Farthållaren mäter den verkliga hastigheten och återför det värdet till kontrolenheten som justerar gasen om den upptäcker en avvikelse.
ie
EF Sponsor
Inlägg: 1378
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: ATMega16 + USART +PC

Inlägg av ie »

Att det ballar ur kan bero på att du har ett "return" i d-caset. Return från main blir inte så bra.

Om du vill behålla din struktur, utan att lagra hela strängen såsom Sodjan föreslår, så kan du ha en gemansam case-sats för alla möjliga indata. När du tar emot en bokstav sätter du kanalvärdet i en variabel och för varje siffra som tas emot så skickas PWM-en ut till senast mottagna kanal. (Sätt dock t ex kanal A som default först, så att någon kanal finns definierad.) Det innebär att även följande kommandosträng fungerar A5D567654A4, dvs du kan skicka flera siffror till senast angivna kanal.

För att förenkla/förtydliga koden kan du istället för att skriva

Kod: Markera allt

      // 97 = 'a'
         if (FanCH==97)
skriva

Kod: Markera allt

         if (FanCH=='a')
Dubbelfnuttar indikerar sträng men enkelfnuttar funkar med int eller char.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ATMega16 + USART +PC

Inlägg av sodjan »

Det kanske är självklart, men i alla fall...

> så kan du ha en gemansam case-sats för alla möjliga indata.

Förutsätter så klart att det inte finns några gemensamma tecken
mellan "kanal" och "värde". Men i så fall fungerar det helt OK...

Men det ser också lite underligt ut med den där "return" sist i main()...
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Re: ATMega16 + USART +PC

Inlägg av exos »

okej. Tack för svaren.

Tog bort return; och städade lite i koden, satte kanal a som default mm.

Testa igen, och det är ett eget skrivet program, men kör jag i en terminal och skickar kommandon till AVRén får jag samma "respons"

Som i mitt program, så läser den av inkommande data från AVR'en en gång i sekunden.

nu så fick jag detta.

?1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd?dddddddddddddddd
ddddddddddddddddddddadd64ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
daaaaaaaaaaaaa6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa10aaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bara för att ni skall se, på några ställen finner man siffror. men detta känns ju helt fel.
jag vill ju ist att det skall stå typ "a0", "d4","a10.... osv inte att den skickar kanalen konstant hela tiden.
hoppas ni förstår vad jag menar.

Känns ju som detta kan vara en bidragande orsak till att det inte fungerar som det skall.
Användarvisningsbild
AndLi
Inlägg: 18302
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: ATMega16 + USART +PC

Inlägg av AndLi »

din dump är alltså data skickat från ditt windowsprogram, ner i AVRen och sen har avr skickat tillbaka värdena?

Vem genererar alla dubletter? Är AVR uartfunktion fortfarande pollande?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ATMega16 + USART +PC

Inlägg av sodjan »

Antingen skickas samma tecken hela tiden från sändaren. Eller så läser mottagaren
om samma tecken hela tiden. Du måste ta reda på vilket det är !

Och du måste fortfarande se till att vara mer korrekt och exakt i dina beskrivningar.
Det ser du t.ex av AndLi's motfrågor för att försöka få någon styrsel på det hela.

Så, var gärna övertydlig och kom ihåg att allt inte är så självklart för alla andra
som det är för dig som sitter med prylarna framför dig.
Skriv svar