ATMega16 + USART +PC [LÖST]
ATMega16 + USART +PC [LÖST]
Tjenare. jag har kört fast, min hjärna funkar inte riktigt som den skall.
Jag har ett program på min dator som skall skicka ett värde mellan 0 - 255 via USART till min AVR.
men, AVR'en tar imot varje siffra för sig och i DEC. så t.ex 123 blir 49,50,51
men jag vill att skickar jag t.ex "12" så skall man få en variabel med värdet "12" helt enkelt.
hoppas ni förstår.
så skall man convertera det eller?
Jag har ett program på min dator som skall skicka ett värde mellan 0 - 255 via USART till min AVR.
men, AVR'en tar imot varje siffra för sig och i DEC. så t.ex 123 blir 49,50,51
men jag vill att skickar jag t.ex "12" så skall man få en variabel med värdet "12" helt enkelt.
hoppas ni förstår.
så skall man convertera det eller?
Senast redigerad av exos 24 november 2010, 20:10:39, redigerad totalt 1 gång.
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Re: ATMega16 + USART +PC
Vad använder du för program när du skickar från PC:n?
Testa t ex Bray terminal så kan du välja format. http://sites.google.com/site/terminalbpp/
Testa t ex Bray terminal så kan du välja format. http://sites.google.com/site/terminalbpp/
Re: ATMega16 + USART +PC
du måste skicka en byte med värdet 123 inte en sträng med "123" i.
Iof kan du använda atoi för att konvertera din ascii sträng till ett värde. Men det gör ju att du behöver överföra 3 byte för att få till det som går att skicka i en..
Iof kan du använda atoi för att konvertera din ascii sträng till ett värde. Men det gör ju att du behöver överföra 3 byte för att få till det som går att skicka i en..
Re: ATMega16 + USART +PC
Hmm.. alltså
Det jag håller på med är en fläkt styrning (PWM). och det funkar fint.
PWMOut( "och nåt mellan 0-255" ) detta funkar fint.
då vill jag ha...
PWMOut("Skickat från PC") och då nånting mellan 0-255
Men detta får jag inte att fungera, skickar jag då t.ex "255" surrar den på halv fart, skickar jag därimot tecknet "½" så spinner den på bra, skickar jag "az" går den lite lagom.
Som sagt, den får inte rena siffror.
här har vi kod som finns i AVR'en
sätter man då PWMout(ch)
så uppstår detta problemet, men hur gör jag för att få den att fatta att jag skickar t.ex "255"
MvH
Sebb
Det jag håller på med är en fläkt styrning (PWM). och det funkar fint.
PWMOut( "och nåt mellan 0-255" ) detta funkar fint.
då vill jag ha...
PWMOut("Skickat från PC") och då nånting mellan 0-255
Men detta får jag inte att fungera, skickar jag då t.ex "255" surrar den på halv fart, skickar jag därimot tecknet "½" så spinner den på bra, skickar jag "az" går den lite lagom.
Som sagt, den får inte rena siffror.
här har vi kod som finns i AVR'en
Kod: Markera allt
char ch;
if (UCSRA & 0x80)
{
ch = UDR;
så uppstår detta problemet, men hur gör jag för att få den att fatta att jag skickar t.ex "255"
MvH
Sebb
Re: ATMega16 + USART +PC
Skickar från ett VB.NET program.
SerialPort1.Write.
Men även med olika terminaler.
inget som funkar
-----------------------------------
Kollar man denna sidan.
http://www.ascii-code.com/
skickar jag "SYMBOLERNA" så funkar det...
ÿ = 255
€ = 128
osv...
edit: La till lite text
SerialPort1.Write.
Men även med olika terminaler.
inget som funkar

-----------------------------------
Kollar man denna sidan.
http://www.ascii-code.com/
skickar jag "SYMBOLERNA" så funkar det...
ÿ = 255
€ = 128
osv...
edit: La till lite text
Re: ATMega16 + USART +PC
Det du kan göra (eller man kunde på VB6) är att skicka chr(255). Eller vilket värde du nu vill skicka.
Men vad vill du göra? Skicka en symbol eller kunna skicka strängar med värdena?
Men vad vill du göra? Skicka en symbol eller kunna skicka strängar med värdena?
Re: ATMega16 + USART +PC
Okey, nu fick jag det att fungera, men det känns inte optimalt.
så nu skickar den "SYMBOLER" allt efter som jag drar i TrackBaren. men drar man en stund så hänger sig AVR'en eller mer troligen Seriell förbindelsen.
Kod: Markera allt
Dim number As Int16
Dim out As String
number = TrackBar1.Value
out = Chr(number)
SerialPort1.Write(out)
Re: ATMega16 + USART +PC
Här kommer den.
Kod: Markera allt
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/iom16.h>
#include <inttypes.h>
void USARTInit(uint16_t ubrr_value)
{
//Set Baud rate
UBRRH=0x00;
UBRRL=0x33;
/*Set Frame Format
>> Asynchronous mode
>> No Parity
>> 1 StopBit
>> char size 8
*/
UCSRC=(1<<URSEL)|(3<<UCSZ0);
//Enable The receiver and transmitter
UCSRB=(1<<RXEN)|(1<<TXEN);
}
void InitPWM()
{
/*
TCCR0 - Timer Counter Control Register (TIMER0)
-----------------------------------------------
BITS DESCRIPTION
NO: NAME DESCRIPTION
--------------------------
BIT 7 : FOC0 Force Output Compare [Not used in this example]
BIT 6 : WGM00 Wave form generartion mode [SET to 1]
BIT 5 : COM01 Compare Output Mode [SET to 1]
BIT 4 : COM00 Compare Output Mode [SET to 0]
BIT 3 : WGM01 Wave form generation mode [SET to 1]
BIT 2 : CS02 Clock Select [SET to 0]
BIT 1 : CS01 Clock Select [SET to 0]
BIT 0 : CS00 Clock Select [SET to 1]
The above settings are for
--------------------------
Timer Clock = CPU Clock (No Prescalling)
Mode = Fast PWM
PWM Output = Non Inverted
*/
TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
//Set OC0 PIN as output. It is PB3 on ATmega16 ATmega32
DDRB|=(1<<PB3);
}
/* TYP SetPWMOutput(40) 0-255*/
void SetPWMOutput(uint8_t duty)
{
OCR0=duty;
}
void Wait()
{
_delay_loop_2(10000);
}
char USARTReadChar()
{
//Wait untill a data is available
while(!(UCSRA & (1<<RXC)))
{
//Do nothing
}
return UDR;
}
void main() {
char data;
USARTInit(51);
InitPWM();
uint8_t speed=254;
while(1)
{
USARTReadChar();
data=UDR;
SetPWMOutput(data);
_delay_ms(100);
}
}
Re: ATMega16 + USART +PC
Din funktion returnerar ett värde. Det är det du ska lagra i en variabel.
Kod: Markera allt
data = USARTReadChar();
Re: ATMega16 + USART +PC
Backa lite, andas djupt och tänkt till lite...
*Generellt* är det ingen nackdel att skicka ditt "värde" som ASCII!
Tvärtom har det många och stora fördelar.
Det gör t.ex felsökning mycket enklare och du kan t.ex använda
ett vanligt terminalprogram för att testköra och felsöka.
På AVR sidan så är det ju skitenkelt att addera ihop de tre siffrorna
till ett värde 0-255 igen. Du fixar det en gång för alla och sedan har
du klartext på serielinan. Att försöka skicka *alla* värden mellan 0 och
255 över en serielina är att verkligen be om problem. Det finns flera tecken
som normalt inte "går igenom" därför att de har speciella funktioner. Det kan
fungera om man studerar det hela noga och ser till att hela linan är helt
transparent och inte stoppar några tecken, men det kräver en del extra jobb
för ingen nytta alls.
Det blir också helt omöjligt att ha någon slags "start" och "stopp" tecken eftersom
de ju även kan förekomma när som helst som "värde" ! Bara det gör att hela
idén att skicka värden 0-255 är helkass från början !
Slutligen så har jag lite svårt att se att man behöver styra en fläkt i 256 nivåer,
det kommer knappt att vara någon skillnad alls mellan två steg. Men vill du ha
det så så OK...
*Generellt* är det ingen nackdel att skicka ditt "värde" som ASCII!
Tvärtom har det många och stora fördelar.
Det gör t.ex felsökning mycket enklare och du kan t.ex använda
ett vanligt terminalprogram för att testköra och felsöka.
På AVR sidan så är det ju skitenkelt att addera ihop de tre siffrorna
till ett värde 0-255 igen. Du fixar det en gång för alla och sedan har
du klartext på serielinan. Att försöka skicka *alla* värden mellan 0 och
255 över en serielina är att verkligen be om problem. Det finns flera tecken
som normalt inte "går igenom" därför att de har speciella funktioner. Det kan
fungera om man studerar det hela noga och ser till att hela linan är helt
transparent och inte stoppar några tecken, men det kräver en del extra jobb
för ingen nytta alls.
Det blir också helt omöjligt att ha någon slags "start" och "stopp" tecken eftersom
de ju även kan förekomma när som helst som "värde" ! Bara det gör att hela
idén att skicka värden 0-255 är helkass från början !
Slutligen så har jag lite svårt att se att man behöver styra en fläkt i 256 nivåer,
det kommer knappt att vara någon skillnad alls mellan två steg. Men vill du ha
det så så OK...
Re: ATMega16 + USART +PC
Ok, jag håller helt med att kunna reglera en fläkt med 255 i upplösning är ganska overkill. men ville bara få det att funka, men om du säger att vissa tecken är "deklarerade" för vissa funktioner så förstår jag att man får problem om man skickar dessa, då är frågan vilka det är, skall se om jag kan googla det.
Men nu gjorde jag så att jag ändra från 255 steg till 10, med en ökning på ca 25 per steg, 25,50,75... osv.
Det funkar upp till 150, sen sänka ner igen. inga problem, men går jag över så sänks hastigheten, så får jag starta om AVR'en för att få den att funka igen.
skall googla lite nu.
Men nu gjorde jag så att jag ändra från 255 steg till 10, med en ökning på ca 25 per steg, 25,50,75... osv.
Det funkar upp till 150, sen sänka ner igen. inga problem, men går jag över så sänks hastigheten, så får jag starta om AVR'en för att få den att funka igen.
skall googla lite nu.
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Re: ATMega16 + USART +PC
Skicka två tecken istället, eller lägg dem i ett annat intervall. 25 steg kan ju tex läggas från 49 och uppåt utan problem. Ett alternativ är att skicka Hex som sträng, från h'00' till h'FF'.
Re: ATMega16 + USART +PC
> Men nu gjorde jag så att jag ändra från 255 steg till 10, med en ökning på ca 25 per steg, 25,50,75... osv.
Läs på lite om ASCII. Du skickar fortfarande tecken som ligger inom Styrtecken/kontrolltecken.
Om du vill ha 10 steg så räcker det med att skicka t.ex siffrorna 0-9 (48-59 decimalt).
Sedan kan du räkna om det till lämpliga PWM värden i AVR'n. Det är ju inte heller
säkert att det är bäst med samma "steg" mellan alla nivåer ! D.v.s att PC'n i princip
bara skickar vilket "steg" som fläkten ska ha (d.v.s 1-10) och inte bryr sig så mycket
om vilken PWM värde detta motsvarar, det kan överlåtas till AVR'ens programvara.
> skall se om jag kan googla det.
Googla "ASCII" och kolla första träffen...
Läs på lite om ASCII. Du skickar fortfarande tecken som ligger inom Styrtecken/kontrolltecken.
Om du vill ha 10 steg så räcker det med att skicka t.ex siffrorna 0-9 (48-59 decimalt).
Sedan kan du räkna om det till lämpliga PWM värden i AVR'n. Det är ju inte heller
säkert att det är bäst med samma "steg" mellan alla nivåer ! D.v.s att PC'n i princip
bara skickar vilket "steg" som fläkten ska ha (d.v.s 1-10) och inte bryr sig så mycket
om vilken PWM värde detta motsvarar, det kan överlåtas till AVR'ens programvara.
> skall se om jag kan googla det.
Googla "ASCII" och kolla första träffen...