Sida 1 av 5
ATMega16 + USART +PC [LÖST]
Postat: 17 november 2010, 20:07:01
av exos
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?
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 20:16:49
av thepirateboy
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/
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 20:40:55
av AndLi
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..
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 21:21:00
av exos
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
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 21:32:02
av AndLi
vad kör du på PC sidan?
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 21:41:22
av exos
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
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 22:16:18
av AndLi
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?
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 22:18:11
av exos
Okey, nu fick jag det att fungera, men det känns inte optimalt.
Kod: Markera allt
Dim number As Int16
Dim out As String
number = TrackBar1.Value
out = Chr(number)
SerialPort1.Write(out)
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.
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 22:24:20
av AndLi
posta avr koden som hanterar serieporten så ska det nog gå att lösa
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 22:33:29
av exos
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
Postat: 17 november 2010, 22:57:28
av ie
Din funktion returnerar ett värde. Det är det du ska lagra i en variabel.
Re: ATMega16 + USART +PC
Postat: 17 november 2010, 23:23:39
av sodjan
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...
Re: ATMega16 + USART +PC
Postat: 18 november 2010, 14:57:16
av exos
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.
Re: ATMega16 + USART +PC
Postat: 18 november 2010, 15:03:10
av PHermansson
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
Postat: 18 november 2010, 15:30:11
av sodjan
> 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...