Forum: Mikrocontroller und Digitale Elektronik Atmega64 PDI/O und RXD/TXD gleichzeitig


von Schorsch (Gast)


Lesenswert?

Hallo zusammen,

kurze Frage,

ich erprobe gerade mein neues Board, welches einen Atmega64 verwendet.

Da ich das Datenblatt nicht richtig lesen konnte und gepennt habe, 
musste ich nachträglich PDI/O mit MISO und MOSI von meinem ISP socket 
verbinden.

Leider benutzt ich diese Leitung aber auch schon für meine Uart 
Verbindung.

Sollte das ein Problem sein? Ich nehme an, sobald !Reset auf Low, wird 
PE0 und PE1 dann zu PDI/O und hat keine Funktion mehr als RXD und TXD, 
oder?

Aktuell habe ich es geschafft ein kleines Progammili, welches eine 
wake-up message per Uart versenden sollte auf den µC zu überspielen. 
Aber seit dem, lässt er sich nicht mehr programmieren. Hängt er jetzt 
doch in irgendwelchen ISRs?

Gruß Georg

von Falk B. (falk)


Lesenswert?

@ Schorsch (Gast)

>Sollte das ein Problem sein?

Ja:

>Ich nehme an, sobald !Reset auf Low, wird
>PE0 und PE1 dann zu PDI/O und hat keine Funktion mehr als RXD und TXD,
>oder?

Sicher, aber die ICs aussen wissen das nicht. Ganz besonders nicht der 
IC (MAX232, FT232 oder sonstwas), die RXD treiben. Die musst du trennen 
oder beim !RESET inaktiv schalten.

>Aber seit dem, lässt er sich nicht mehr programmieren. Hängt er jetzt
>doch in irgendwelchen ISRs?

Nö. Am IC, der RXD aktiv treibt.

von holger (Gast)


Lesenswert?

>Leider benutzt ich diese Leitung aber auch schon für meine Uart
>Verbindung.
>
>Sollte das ein Problem sein?

Ja.

>Ich nehme an, sobald !Reset auf Low, wird
>PE0 und PE1 dann zu PDI/O und hat keine Funktion mehr als RXD und TXD,
>oder?

Das interessiert einen MAX232 der dort angeschlossen sein könnte
nicht die Bohne. Mach nen 4k7 zwischen Mäxchen und dem RxD Eingang,
dann passt das.

>Aber seit dem, lässt er sich nicht mehr programmieren. Hängt er jetzt
>doch in irgendwelchen ISRs?

Nö, wahrscheinlich extern Clock statt Crystal Osc in den Fuses 
eingestellt.
Jetzt hat er keinen Takt mehr.

von Schorsch (Gast)


Lesenswert?

Hi,

hm...

am UART hängt ein FTDI....
ich benutze einen extenen Taktgeber, habe dafür die lfuse of e0 gesetzt.

den FTDI habe ich mal eben "offgepowered" geht immer noch nicht.

Ich benutze einen avrisp2 als programmer, der zeigt mir zwar die 5V 
Betriebsspannung an, meldet dann aber unknown status.

Meint ihr wirklich, dass ich die RXD Leitung trennen muß? Der Chip ist 
doch schon aus

Schorsch

von holger (Gast)


Lesenswert?

>Meint ihr wirklich, dass ich die RXD Leitung trennen muß? Der Chip ist
>doch schon aus

Und schliesst über seine Schutzdioden die RxD Leitung kurz.

von Karl H. (kbuchegg)


Lesenswert?

Schorsch schrieb:

> am UART hängt ein FTDI....

ist wurscht.
Mit seinem Ausgang, der zum µC führt pfuscht er dir ins ISP rein.

> den FTDI habe ich mal eben "offgepowered" geht immer noch nicht.

d.h. Versorgungsspannung abgedreht?

> Meint ihr wirklich, dass ich die RXD Leitung trennen muß? Der Chip ist
> doch schon aus

Dann 'versorgt' sich dein FTDI dann eben über die anderen Verbindungen 
zu ihm und irgendwelcher dubioser Kanäle im Inneren des IC. Ein IC an 
dem die Versorgungsspannung nicht angeschlossen ist, wohl aber die 
Datenleitungen kann alles mögliche unvorhergesehene anstellen.
Also: in die Leitung muss ein Widerstand, der es dem Programmer erlaubt 
an der ISP Leitung zu wackeln, ohne dass ihm der FTDI in die Quere 
kommt.

von Karl H. (kbuchegg)


Lesenswert?

Schorsch schrieb:

> ich benutze einen extenen Taktgeber, habe dafür die lfuse of e0 gesetzt.

E0 ist 'externer Clock'. Aber Achtung: ein Quarz ist kein 'externer 
Clock'.
Wenn dein externer Taktgeber ein Quarz ist, dann sitzt hier noch ein 
Problem. Ist das ein kompletter Taktgenerator, dann ist alles ok.

von Schorsch (Gast)


Lesenswert?

Ihr seit toll

habe eine Stelle gefunden, wo ich die die RXD Leitung kappen konnte, wo 
aber später auch noch ein Widerstand reinpasst - das ist bei 6mil gar 
nicht so einfach :-)


Es geht!


Also, wenn ich nun 4k7 reintune, kann ich sowohl den UART als auch ISP 
benutzen?  Gibt es eine Baudratenlimitierung oder sowas?

Zum Taktgeber:

Ich benutze eins von diesen Dingern mit 4 Beinchen, wie heißen die? 
Quarzoszillatoren?

Danke vielmals

Georg

von holger (Gast)


Lesenswert?

>Also, wenn ich nun 4k7 reintune, kann ich sowohl den UART als auch ISP
>benutzen?  Gibt es eine Baudratenlimitierung oder sowas?

Also bis 115kBaud geht das bei mir problemlos.
Wenn du mehr willst kannst du auch auf 2k2 oder 1k runtergehen.
Was dein ISP Prommer halt so aushält.

Und schalte den FTDI nicht ab. Sonst bekommst du das gleiche
Problem mit der TxD Leitung. Oder auch da nen 4k7 in die Leitung
zum TxD Pin vom FTDI.

von Schorsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich freu mich,

wie man sieht ist der 4k7 drin. Werd mal schauen, wie schnell ich damit 
werden kann, wollte eigentlich schon gerne auf 230kBaud hoch, mal sehen

jetzt muß ich erstmal den UART ans laufen kriegen, hat jemand zufällig 
gerade die Init-Routine für UART0 für einen mega64? ich bastele noch an 
dem "8N1"

Georg

von Spess53 (Gast)


Lesenswert?

Hi

>jetzt muß ich erstmal den UART ans laufen kriegen, hat jemand zufällig
>gerade die Init-Routine für UART0 für einen mega64? ich bastele noch an
>dem "8N1"

Schon mal die Codebeispiele im Datenblatt angesehen?

MfG Spess

von Schorsch (Gast)


Lesenswert?

Hallo,

vielen Dank erstmal,

habe im Wesentlichen die Beispiele aus dem Datenblatt übernommen


Das ist die Init routine
1
        /* Set baud rate */ 
2
  uint16_t baud = 115200;
3
  UBRR0H = (unsigned char)(baud>>8); 
4
  UBRR0L = (unsigned char)baud; 
5
  
6
  /* Enable receiver and transmitter */ 
7
  UCSR0B = (1<<RXEN0)|(1<<TXEN0); 
8
  /* Set frame format: 8data, 2stop bit */ 
9
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);


das die sende-routinen

1
int uart_putc(unsigned char c)
2
{
3
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
4
    {
5
    }                             
6
 
7
    UDR0 = c;                      /* sende Zeichen */
8
    return 0;
9
}
10
11
12
void uart_puts (char *s)
13
{
14
    while (*s)
15
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
16
        uart_putc(*s);
17
        s++;
18
    }
19
}

alles scheint richtig angeschlossen, denn, wenn der ISP Programmer 
loslegt empfange ich etliche Zeichen, nur wenn ich alle 500ms "puts" 
aufrufe kommt nix

Any hint?

Georg

von Schorsch (Gast)


Lesenswert?

Sorry, einen hab ich schon

UBRR_VAL != baud


better like this
1
        UBRR0H = (unsigned char)(UBRR_VAL>>8); 
2
  UBRR0L = (unsigned char)UBRR_VAL;

tut immer noch nicht

Schorsch

von holger (Gast)


Lesenswert?

>  uint16_t baud = 115200;

uint16_t geht bis 65535. Da bist du weit drüber.

von c-hater (Gast)


Lesenswert?

Schorsch schrieb:

>         /* Set baud rate */
>   uint16_t baud = 115200;
>   UBRR0H = (unsigned char)(baud>>8);
>   UBRR0L = (unsigned char)baud;

Das ist Doppelblödsinn. Zum einen paßt die Baudrate garnicht in den 
Datentyp, zum anderen ist es totaler Quatsch, die Baudrate direkt in die 
UBRR-Register zu schreiben. Da rein gehört nicht die Baudrate, sondern 
das Ergebnis einer kleinen Berechnung, bei der der Systemtakt und die 
Baudrate die Eingangsgrößen sind.

Details siehe das verdammte Datenblatt. Da steht sowas nämlich drin. Da 
ist auch erklärt, was die UBRR-Register funktional machen, woraus sich 
also die Formel für die Berechnung ergibt.

von Stefan (Gast)


Lesenswert?

Dafür gibt's in der AVR Library schon ein praktisches Makro:

http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.