Forum: Mikrocontroller und Digitale Elektronik ATtiny44 -Software Uart - nur senden


von Schorsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
vor deutlich mehr als 5 Jahren habe ich eine Schaltung auf Basis eine 
Attiny44 PDIP entwickelt. Damals habe ich noch mit Bascom programmiert 
bis für mich eine CAN Anwendung das aus für Bascom bedeutete.

Das Layout wurde in einige Platinen gegossen und so sind heute noch ein 
paar übrig.

Da nun die Anwendung wieder aktuell auf den Tisch kommt möchte ich diese 
Bascom Software gerne in "C" umsetzen. Da Bascom das kann sollte es mit 
"C" aus gehen nur noch schneller.


Layout:
Pin 1 = 5V , Pin 14 = GND,
Pin 2 und 3 = XTAL 8MHz,
Pin 4 = reset,
Pin 5 = INT0 für eine Frequenzmessung,
Pin 6 = OC0B PWM über Timer 0,
Pin 7 = ADC6,
Pin 8 = Bascom ""Open "COMA.5:9600,8,N,1" For Output As #1"",
Pin 9 = Im Bascomprogramm nicht belegt. Nur als Rx im AVRootloder von 
Dietmar,
Pin 10 - Pin 13 = ein 4 fach DIPSchalterseqment.

Im Programm wird Timer 1 (16Bit), prescale 64 nur der Timerüberlauf isr 
ca. 2Sek. verwendet.


Die Frage: gibt es ein Beispiel für eine Software Uart - Senden über Pin 
8/A5 ?

von Stefan F. (Gast)


Lesenswert?

Mir ist jetzt nicht ganz klar, ob du ein Beispiel in BASCOM oder ein 
Beispiel in C suchst. Für C habe ich da etwas: 
http://stefanfrings.de/avr_hello_world/index.html

von spess53 (Gast)


Lesenswert?

HI

>Die Frage: gibt es ein Beispiel für eine Software Uart - Senden über Pin
>8/A5 ?

Da gibt es einige AppNotes:

AVR274: Single-wire Software UART
AVR304: Half Duplex Interrupt Driven Software UART
AVR305: Half Duplex Compact Software UART
AVR307: Half Duplex UART Using the USI Module

MfG Spess

von Schorsch (Gast)


Lesenswert?

Hallo Ihr beiden und DANKE !

Ja genau von Basom bin ich schon länger weg und "C" ist für mich jetzt 
der Weg (Anfänger Level).
in dem Beispiel von Stefanus habe ich passendes gefunden.

Dazu habe ich mir noch was umgebaut und nutze jetzt Print um auf dem Pin 
A5 die Ausgabe zu starten.

von Karl M. (Gast)


Lesenswert?

Schorsch schrieb:
> Hallo Ihr beiden und DANKE !
>
> Ja genau von Basom bin ich schon länger weg und "C" ist für mich jetzt
> der Weg (Anfänger Level).
> in dem Beispiel von Stefanus habe ich passendes gefunden.
>
> Dazu habe ich mir noch was umgebaut und nutze jetzt Print um auf dem Pin
> A5 die Ausgabe zu starten.

Wie geht das?

Bitte mit Beispiel. Danke.

von Stefan F. (Gast)


Lesenswert?

Karl M. schrieb:
> Wie geht das?

Steht eigentlich in meinem Beispiel ZIP. Die entscheidenden Zeilen sind:
1
static int serial_write(char c, FILE *unused)
2
{
3
   ...
4
}
5
6
static FILE serialPort = FDEV_SETUP_STREAM(serial_write, 0, _FDEV_SETUP_WRITE);
7
8
stdout = &serialPort;

von Karl M. (Gast)


Lesenswert?

Danke Stefan,

die Verbindung habe ich nicht herstellt.

von Schorsch (Gast)


Lesenswert?

So hab ich das gemacht........

// Files for input and output through serial port.
static int serial_write(char, FILE *);

// Calculate the time per bit -9 CPU cycles (which is the length of the 
for loop in function serial_write)
#define US_PER_BIT 1000000/SOFTSERIAL_BITRATE-9/F_CPU

//#define US_PER_BIT 1000000/9600-9/F_CPU


// Macro to send strings stored in program memory space
  #define PRINT(format, ...) printf_P(PSTR(format), ## _VA_ARGS_)


// Write a character to the serial port
  static int serial_write(char cData, FILE *pxStream)
      {
         // Recursive function to prepend a carriage return before a new 
line
           if(cData == '\n')
           {
             serial_write('\r',pxStream);
           }
        cli();
        // Send start bit
        SOFTSERIAL_TXD_LOW;
        _delay_us(US_PER_BIT);
            // Send 8 data bits
            for (uint8_t i=0; i<8; i++)
            {
                if (cData & 1)
                {
                    SOFTSERIAL_TXD_HIGH;
                }
                else
                {
                    SOFTSERIAL_TXD_LOW;
                }
                _delay_us(US_PER_BIT);
                cData = cData>>1;
            }
            SOFTSERIAL_TXD_HIGH;
            sei();
            _delay_us(2*US_PER_BIT);
          return 0;
      }


// Create PRINTF Stream structure
static FILE serialPort = FDEV_SETUP_STREAM(serial_write, 0, 
_FDEV_SETUP_WRITE);


// Initialize the serial port
void initSerialConsole(void)
{
    SOFTSERIAL_TXD_INIT;
    SOFTSERIAL_TXD_HIGH;
    // Bind stdout to the serial port
    stdout = &serialPort;
}

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

So hab ich das gemacht........
1
void sputchar(char c)
2
{
3
  c = ~c;                                       // complement to send 0 = stop bit(s)
4
  STXD_oe = 1;                                  // output
5
  STXD = MARK;                                  // start bit
6
  for (uint8_t i = 9 + STOP_BITS; i; i--)       // start + data + stop bits
7
  {
8
    _delay_us(1e6 / BAUD);                      // bit duration
9
    if (c & 1)
10
      STXD = MARK;
11
    else
12
      STXD = !MARK;                             // = Space
13
    c >>= 1;                                    // next bits or stop bit(s)
14
  }
15
}

Der vollständige Code mit Bespiel ist im Anhang.
Es kann die Anzahl der Stopbits und die Polarität definiert werden. Im 
Beispiel ist die direkte Verbindung mit der RS-232 des PC ausgewählt.

von Peter D. (peda)


Lesenswert?

Der Code ist natürlich Mist, es muß
1
void sputchar(unsigned char c)
heißen.
Sonst geht das rechts Schieben schief.

Beitrag #6355120 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Peter D. schrieb:
> es muß "unsigned char c" heißen.
> Sonst geht das rechts Schieben schief.

Nein. ich kann Dir mit 100% Sicherheit sagen, dass das auch mit signed 
char tadellos funktioniert. Zumindest auf dieser Architektur und mit dem 
gcc.

von floh boing (Gast)


Lesenswert?

Schorsch schrieb:
> -9/F_CPU

Hier fehlt eine Million, sonst kommen keine Mikrosekunden raus, sondern 
Sekunden.

Also

-9*1000000/F_CPU

Test: bei 1 MHz sind 9 Takte == 9 us, bei 10 MHz entsprechend nur 0,9 
us.

von floh boing (Gast)


Lesenswert?


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.