Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Atmega32 en seriele poorten probleem.

Pagina: 1
Acties:
  • 115 views sinds 30-01-2008
  • Reageer

  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
Haaai :w


Ik heb weer eens een stom probleem :( :P

Ik ben een beetje aan het spelen met de AVR Atmega32. Erg leuk allemaal en een ledje laten knipperen gaat prima :+
Nu zit ik alleen te klooien met de USART en de seriele poort.
Ik gebruik Codevision als C-compiler, en die kan zelf je seriele poort registers goed zetten. Dit is de instelling van de seriele poorten:

code:
1
2
3
4
5
6
7
8
9
10
11
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 2400
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0xCF;


Dus ik stel mijn seriele poort daarop in (Flow control staat uit), en als ik dan dmv van:

code:
1
putchar('U');


'U' naar de seriele poort stuur krijg ik op de seriele poort alleen maar "80 80 80 80 80" (en dit 100x omdat het geval in een loopje staat).

Schakeling lijkt in orde. DUs wat doe ik fout. Iemand enig idee? :)

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


  • MewBie
  • Registratie: April 2002
  • Laatst online: 14:07
Dat probleem had ik ook met een 2313, zeer irritant :(
Welke instellingen je ook veranderd je ontvangt alleen maar crap. Ik heb uiteindelijk die 2313 weggegooid omdat ook nog een pwm kanaal gaar was :P

Ben dus ook wel benieuwd naar de oplossing.

Please leave a message after the beep.
*beeeeep*


  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
MewBie schreef op zondag 28 januari 2007 @ 15:26:
Dat probleem had ik ook met een 2313, zeer irritant :(
Welke instellingen je ook veranderd je ontvangt alleen maar crap. Ik heb uiteindelijk die 2313 weggegooid omdat ook nog een pwm kanaal gaar was :P

Ben dus ook wel benieuwd naar de oplossing.
Hmm dan ga ik maar eens een andere Atmega proberen.... Heb er nog wel 1tje liggen.
Tja op mijn werk hebben we de Atmega 162, en daar heb ik precies hetzelfde mee gedaan en die werkt wel goed :?

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Kan je eens met printf("Atlas"); proberen en kijken wat die dan doet?

Ik heb het aan het werken gekregen gehad op een mega32, ik zal zo die code eens voor je opzoeken...

Edit:
Dit is dus wat ik van registers zette:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0,2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x19; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x98;
}
Ik heb wel een klein beetje andere instellingen.

[ Voor 56% gewijzigd door kluyze op 28-01-2007 16:08 ]


  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
Weer hetzelfde gezeik, ook als ik jouw instellingen probeer :(

Weer die 80 00 80....
Wat gaat er hier mis? :P

Zou het iets te maken kunnen hebben met de fuses?

[ Voor 18% gewijzigd door Atlas op 28-01-2007 22:11 ]

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 21-11 19:09

TrailBlazer

Karnemelk FTW

op welke frequentie draait die AVR. hij zou inclusief prescaler op 1MHz moeten draaien

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Baud rate is afhankelijk van de systeemklok, dus hoe heb je die staan? Extern kristal, interne oscillator? Dat zit inderdaad in de fuses. Daarnaast wordt de stop bit volgens mij weinig gebruikt, waarmee test je de communicatie?

www.madwizard.org


Verwijderd

Even voor de duidelijkheid, je hebt die avr toch wel met een max232 (of soortgelijke converter) aan je seriele poort gehangen?
Je terminal programma staat ook op de goede baudrate (geen idee of dat noodzakelijk is, ik stel 't iig altijd in)?

[ Voor 6% gewijzigd door Verwijderd op 28-01-2007 22:25 ]


  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
TrailBlazer schreef op zondag 28 januari 2007 @ 22:20:
op welke frequentie draait die AVR. hij zou inclusief prescaler op 1MHz moeten draaien
Ik heb in codevision aangegeven dat dat ding op 8 Mhz moet draaien :)
madwizard schreef op zondag 28 januari 2007 @ 22:22:
Baud rate is afhankelijk van de systeemklok, dus hoe heb je die staan? Extern kristal, interne oscillator? Dat zit inderdaad in de fuses. Daarnaast wordt de stop bit volgens mij weinig gebruikt, waarmee test je de communicatie?
Interne Oscillator op 8 Mhz :)
Communicatie test ik door wat naar de seriele poort te gooien en op te vragen met realterm (dood aan Hyperterminal :P). Fuses staan op default :)
Verwijderd schreef op zondag 28 januari 2007 @ 22:24:
Even voor de duidelijkheid, je hebt die avr toch wel met een max232 (of soortgelijke converter) aan je seriele poort gehangen?
Je terminal programma staat ook op de goede baudrate (geen idee of dat noodzakelijk is, ik stel 't iig altijd in)?
Jup staat met een Max232 aangesloten (inc alle c's). TX van AVR naar de TTL input van de MAX 232, en dan de RS232 output van de max232 naar de RX (pootje 2) van de seriele poort :)

Jup staat keurig op de goede baudrate.


Zou een extern kristal (of oscillator) uitmaken? :)

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Hmmm mijn instellingen waren voor een 4MHz kristal.

Om te weten of alles aan de pc kan juist werkt kan je eens even achter de max232 de rx en tx even aan elkaar hangen om dan in hyperterminal of zo wat te typen en te zien of je ook iets op het scherm krijgt.

Als je wil kan ik mijn code wel eens volledig doorsturen, ik werk wel niet met commando's als putchar maar werk met het UDR register. Mijn code zou volledig moeten werken op een mega32 met een 4MHz kristal.
(Geschreven in iccavr trouwens)

  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
Ik ga er morgen even een 8 Mhz oscillator aan hangen. Eens zien of dat zin heeft.
Anders wil ik graag jouw code hebben Kluyze :)

Morgen beundag, ik laat van me horen ;)

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


Verwijderd

Atlas schreef op zondag 28 januari 2007 @ 22:36:

Ik heb in codevision aangegeven dat dat ding op 8 Mhz moet draaien :)
Moet je daar niet aangeven hoe hard hij werkelijk loopt (1MHz dus) ipv wat je zou willen dat hij loopt :?

  • Farmerwood
  • Registratie: September 2004
  • Niet online
Ik heb begin deze maand een begin gemaakt met ene nieuw projectje met een ATmege32 en daar heb ik onderstaande (gestripte) code en instellingen voor gebruikt. Compiler is IAR 4.10 en de Atmega32 zit in mijn STK500 geprikt.
Alles wat via de RS232 binnen komt echo ik terug in deze code en ik laat hem ook zien via de leds.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
unsigned char ucRecvChar;

void main (void)
{
  initDevices();    

  do
  { 

  } while (1);
}

void initDevices( void )
{
  __disable_interrupt ();           
  initTimer1();             
  initUsart();              

  MCUCR = 0x00;             /* Micro Control Unit Control Register*/
  GICR = 0x00;                      /* General Interrupt Control Register*/
  SREG |= 0x80;
  __enable_interrupt ();    
}

void initTimer1( void )
{
  TCCR1A = 0x00;
  TCCR1B = 0x00;                /* Stop timer during init */
  OCR1A  = 0x059D;              /* Compare value = 1437 (10Hz) */
  TIMSK  = 0x10;                /* CompareA interrupt enable */
  TCCR1B = 0x0B;                /* Clear on compare, presc. = 64 */
}

void initUsart( void )
{
    UCSRA = 0x00;               
    UCSRB = 0xD8;               
    UCSRC = 0x86;           
    UBRRH = 0;      
    UBRRL = 25;     
}

void transmitByte( unsigned char data )
{
    while( !(UCSRA & (1<<5)) );
    UDR = data;
}

#pragma vector = USART_RXC_vect
    __interrupt void ComRecv( void )
{
  ucRecvChar = UDR;             
  transmitByte( ucRecvChar );
  PORTB = (0xFF - ucRecvChar);  /* Put UDR @ the leds of the STK500 */
}


Instellingen waar ik nu mee werk:
FUSES in AVRstudio:
00 - On-Chip Debug Enabled
01 - JTAG Interface Enabled
08 - Boot Flash section size=2048 words Boot....
09 - Boot Reset vector Enabled
11 - Brown-out Detection level at VCC=2.7V
?? - Int RC Osc. 8 Mhz Startup time 6 CK + 64 ms

Lockbits:
Mode 1: No memory lock features enabled
Application Protection Mode 1 ...
Boot Loader Protection Mode 1 ...

Settings UART @ PC
- Baudrate: 19200
- Databits: 8
- Parity: none
- Stopbits: 1
- Databesturing:none
--------------------------------------------------------------------------------------------------------------------------

Je kunt ook eens proberen of je MAX232 goed zit door de RX en TX van de AVR eens door te verbinden. Dan moet je op de pc dus een echo zien van wat je verstuurd.

Verwijderd

Fuses staan op default
Stel dan maar 1Mhz in code vision. :)

Altijd handig: de AVR fuse calculator http://palmavr.sourceforge.net/cgi-bin/fc.cgi

  • Paul
  • Registratie: September 2000
  • Laatst online: 13:03
code:
1
2
3
4
5
6
7
8
9
10
11
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 2400
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0xCF;


UCSRA=0x00; Event-flags uit, Geen asynchrone snelheids-verdubbelaar, geen multi-proc mode

UCSRB=0xD8; RX Complete en TX Complete interrupt aan, RX en TX enable

UCSRC=0x86; Verplicht URSEL setten, (samen met UCSZ2 uit UCSRB) 8 bit datamode, asynchroon, geen parity, 1 stop bit

UBRRH=0x00; De 4 MSB van UBRR op 0

UBRRL=0xCF; UBRR op 207, 2400bps bij 8 MHz, helaas draait de interne osc maar op 1 MHz

Als je van UBRRL 25 maakt (of 0x19), dan werkt het :)

UBBR bereken je door de frequentie waarop het ding daadwerkelijk draait te delen door (16 * gewenste baudrate) en er nog 1 vanaf te trekken.

UBBR = (Fosc / (16 * baud)) - 1

Edit: Ik snap de verwarring al :) De interne klok van de ATmega162 draait namelijk wel op 8MHz :) (Pagina 38), in tegenstelling tot die van de ATmega32, die standaard (met fuses aan te passen) op 1MHz draait (Pagina 29).

[ Voor 18% gewijzigd door Paul op 29-01-2007 12:56 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
Aaahhhh das het probleem :+
Ik ga wel lekker een 8 Mhz oscillator eraan zetten, eens zien of het dan lukt maar ik heb goede hoop nu :)

Dank allen voor de suggesties :)

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

En constanten gebruiken ipv hex waardes is ook wel aan te raden voor de leesbaarheid :)

www.madwizard.org


  • Atlas
  • Registratie: Mei 2002
  • Niet online

Atlas

Ik flits niet meer terug!

Topicstarter
Ik zou me nog even hier melden :+
Inmiddels even een 8 Mhz osciallator eraan gesoldeerd en ik krijg netjes gegevens door :)
Thnx voor de hulp allemaal :)

* Atlas gaat verder kijken hoe de interrupts werken :P

Join the dark side, we have cookies :)
You need only two tools. WD-40 and duct tape. If it doesn't move and it should, use WD-40. If it moves and shouldn't, use the tape.

Pagina: 1