Forum: Mikrocontroller und Digitale Elektronik ATTINY2313 - Peter Fleury's UART Library


von Bernd (Gast)


Lesenswert?

Hallo allerseits,

ich habe in einem Projekt mit dem Mega32 die UART-Library von Peter 
Fleury erfolgreich benutzt.
Beim Versuch dieses Projekt auf einen Tiny2313 zu portieren habe ich das 
Problem, dass per UART nichts gesendet wird.

Ich habe dann ein Minimalbeispiel aus dem Sample-Code auf P. Fleury's 
Website erstellt:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>  
6
#include "uart.h"
7
8
#ifndef F_CPU 
9
#define F_CPU 8000000UL
10
#endif
11
12
#define UART_BAUD_RATE      9600      
13
14
int main(void)
15
{
16
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
17
    sei();
18
    
19
    uart_puts_P("V Test\n");
20
21
    while(1) { }
22
23
    return 0;
24
}

Dabei habe ich bemerkt, dass das Senden über UART immer dann nicht 
funktioniert, wenn ich "delay.h" einbinde (im Beispiel zwar nicht 
notwendig, aber in meinem eigentlichen Projekt schon).

Hat jemand eine Idee wo das Problem sein könnte?

Vielen Dank und viele Grüße

Bernd

von Stefan E. (sternst)


Lesenswert?

Bernd schrieb:
> Dabei habe ich bemerkt, dass das Senden über UART immer dann nicht
> funktioniert, wenn ich "delay.h" einbinde (im Beispiel zwar nicht
> notwendig, aber in meinem eigentlichen Projekt schon).
>
> Hat jemand eine Idee wo das Problem sein könnte?

In deiner Reihenfolge von delay.h-Einbinden und F_CPU-Definieren.

von Bernd (Gast)


Lesenswert?

Danke, das musste ich in der Tat umstellen, dann ging der Testcode.

Ich habe mir nochmal meinen Projektcode angeschaut (da hatte ich es in 
der richtigen Reihenfolge)

Ob über den UART etwas gesendet wird hängt davon ab welche Größe meine 
Arrays haben.

Ich habe mal ein paar Test in den Code gepackt und auskommentiert.
Komisch beim Mega32 hatte ich das nicht.

Es ist fast so, als ob die beiden Array zusammen nicht über 19 Elemente 
kommen dürfen...

(ich verwende AVR Studio 4.18 und WinAVR 20100110).

Hier noch einmal ein Beispiel:
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4
5
#define UART_BAUD_RATE 9600      
6
7
#include <stdlib.h>
8
#include <avr/io.h>
9
#include <avr/interrupt.h>
10
#include <avr/pgmspace.h>
11
#include <inttypes.h>
12
#include <util/delay.h>
13
14
#include "uart.h"
15
16
/* Geht
17
int test[15];
18
char test2[4];
19
//*/
20
21
/* Geht auch
22
int test[16];
23
char test2[3];
24
//*/
25
26
///* Geht nicht
27
int test[16];
28
int test2[4];
29
//*/
30
31
32
int main(void) 
33
{
34
  cli();
35
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
36
  sei();
37
  uart_puts("V Starte IR-Relais...\r\n");  
38
39
  while(1) { }
40
41
  return 0;
42
}

von Kai S. (kai1986)


Lesenswert?

Hallo,

hast du mal nachgeschaut, ob der RAM vom ATTiny ausreicht, der hat 
schleißlich nur 128Byte und keine 2kByte wie der ATMega.

Gruß Kai

von Bernd (Gast)


Lesenswert?

Hallo Kai,

danke für deinen Beitrag.
Du hast wohl recht, unten im Buildfenster sehe ich auch:

"Data:        133 bytes (103.9% Full)"

Da ist dann wohl wirklich der RAM voll.

In meinem richtigen Projekt sinds sogar "179 bytes (139.8% Full)".

Kann man da noch irgendwie tricksen oder sollte ich gleich einen Mega8 
nehmen (der fliegt hier noch so rum)?
Wirklich teurer ist er ja auch nicht.

Viele Grüße

Bernd

von Hubert G. (hubertg)


Lesenswert?

Du könntest den Text den du über den UART ausgibst im Flash lassen.
#include <avr/pgmspace.h>

const char Start[]PROGMEM="V Starte IR-Relais...\r\n";


uart_puts_p(Start);

Hier holt sich das Programm den Text zur Laufzeit aus dem Flash und 
nicht aus dem RAM.

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.