ATtiny44 -Software Uart - nur senden

Gast #5889945
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 ?
Angehängte Dateien:
Gast #5890107
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
Gast #5892035
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.
Gast #5892503
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.
Gast #5901361
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;
}
#5901437
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.
Angehängte Dateien:
Beitrag #6355120 wurde von einem Moderator gelöscht.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.