Sida 1 av 1

AVR + MAX233

Postat: 25 maj 2006, 15:54:57
av Pibben
Jag försöker få en AVR-krets att prata RS232 till min PC.

Kod: Markera allt

    ATmega168               MAX233A               DB9 (hane)
    .--------.       .------------------.         .-------.
    |  2 RXD +-------+ 3 R1OUT   4 R1IN +---------+ 2 RXD |
    |  3 TXD +-------+ 2 T1IN   5 T1OUT +---------+ 3 TXD |
    .        .    .--+ 12 V-  7   11 C+ +--.    .-+ 5 GND |
    .        .    '--+ 17 V-  V   15 C+ +--'    | '-------'
    |        |    .--+ 9 GND  c  16 C2- +--.   ---
    '--------'    +--+ 6 GND  c  10 C2- +--'    -
                  |  '--------+---------'
                 ---          |
                  -          5V
Mellan D-sub-kontakten och PC:n sitter en nollmodemkabel.

Programmet ser ut såhär:

Kod: Markera allt

#include <avr/io.h>

void USART_Init(unsigned int ubrr)
{
   /* Set baud rate */
   UBRR0H = (unsigned char)(ubrr>>8);
   UBRR0L = (unsigned char)ubrr;

   /* Enable the transmitter */
   UCSR0B = (1<<TXEN0);
}


void USART_Transmit(unsigned char data)
{
   /* Wait for empty transmit buffer */
   while( !(UCSR0A & (1<<UDRE0)));

   /* Put data into buffer, send the data */
   UDR0 = data;
}


int main(void) {

   USART_Init(25); /* 19k2 @ 8MHz */

   for(;;) {
      USART_Transmit('a');
      USART_Transmit('\r');
      USART_Transmit('\n');
   }
}
Med PC:ns terminalprogram inställt i 19k2/8N1 så syns där inte ett knyst. Gör jag nåt uppenbart fel?

När jag kör igång terminalprogrammet (TuTTy) så står det i titelraden "COM1 - TuTTy". När jag slår på AVR:en (& co) byter det till " - TuTTy (Disconnected)", så nånting verkar komma fram iaf.

Postat: 25 maj 2006, 16:29:04
av björn
Det första jag ser är att du har satt Rxd till Rxd vilket är fel (vad jag vet), Rxd skall kopplas till Txd, detta för att när tex datorn skickar skall mikrkontrollern temot och viceversa.

EDIT: Alltså : Txd -> T1IN ; Rxd -> T1OUT och "likadant" mellan max232 och datorporten.

EDIT2: se tex http://chaokhun.kmitl.ac.th/~kswichit/MAX232/MAX232.htm

Postat: 25 maj 2006, 16:35:18
av Pibben
Men TXD/RXD i seriekontakten motsvara alltså AVR:ens TXD/RXD inte PC:ns. RXD/TXD korsas väl sen i nollmodemkabeln?

Postat: 25 maj 2006, 16:38:16
av thepirateboy
Jag har provat koden och den fungerar, kör med TestTerm. Men ska du inte ställa in UCSR0C också?

EDIT: Kanske inte finns UCSR0C på 168?

Postat: 25 maj 2006, 16:42:00
av björn
Pibben skrev:Men TXD/RXD i seriekontakten motsvara alltså AVR:ens TXD/RXD inte PC:ns. RXD/TXD korsas väl sen i nollmodemkabeln?
Ahh, nollmodemskabel... ursäkta det missaade jag.

EDIT: tog bort lit fel....

EDIT2: Har du satt avrens fusebits till 8MHz? annars går den väl på 1 Mhz default?

Postat: 25 maj 2006, 16:53:26
av Pibben
thepirateboy skrev:Jag har provat koden och den fungerar, kör med TestTerm. Men ska du inte ställa in UCSR0C också?
Hur har du testkört? Har du samma krets(ar) som jag?

UCRS0C är per default inställt på 8N1, och det borde funka tycker jag.

EDIT: Vad är TestTerm, förresten?

Postat: 25 maj 2006, 16:54:39
av Pibben
björn skrev: EDIT2: Har du satt avrens fusebits till 8MHz? annars går den väl på 1 Mhz default?
Om jag fattat databladet rätt går m168:an i 8MHz per default.

Postat: 25 maj 2006, 16:59:42
av björn
Nej, kolla punkt 7.2.1 på sidan 26.
The device is shipped with Internal oscillator at 8.0 mhz and with the fuse CKDIV8 programmed, resulting in 1.0 MHz system clock.

Postat: 25 maj 2006, 17:02:21
av thepirateboy
Jag kör med Atmega 128 och en seriell till USB-krets istället för MAXxxx så den fysiska kopplingen är inte lika, dock verkar koden funka. TestTerm var ett terminalprogram jag hittade på nätet.
http://www.swcab.nu/Projbank1.html

Postat: 25 maj 2006, 17:22:19
av Pibben
Du har rätt björn, den går i 1MHz.

Nu försökte jag programmera CKDIV8-säkringen till en 1:a med kommandot "avrdude -v -p m168 -c dapa -e -U lfuse:w:0xe2:m" men nu svarar inte kretsen längre :( Vad gjorde jag fel?

Postat: 25 maj 2006, 17:40:18
av björn
Ajajaj, det skull jag ha varnat dig för, jag använder inte själv avrdude så jag vet inte vad du gjorde fel men om fusebitarna blir felställda så att kretsen gå på extern kristall svarar den inte på programmeringen utan att man sätter en extern kristall (eller någon annan typ av ocsillator).

EDIT: Vad programmerar du med för programmerare? Har du någon kristall du kan koppla till kretsen?

Postat: 25 maj 2006, 18:45:51
av Pibben
Det verkar som kretsen blev rätt programmerad, men att programmerarn inte gillar att den kör i 8MHz. Programmeraren jag har är den som beskrivs på http://www.linuxfocus.org/English/Novem ... 52lfindex8

Postat: 25 maj 2006, 19:45:35
av sodjan
Jag har inte använt AVR, men jag förvånas alltid av att det spelar
roll hur den var konfiggad *förra* gången när man ska programmera
om den på nytt. Borde det inte alltid vara möjligt att programmera
om den helt från början ??

Postat: 25 maj 2006, 20:04:19
av björn
JOvisst, det är det med.... men inte med en enkel ICSP.