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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Schorsch (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Karl M. schrieb:
> Wie geht das?

Steht eigentlich in meinem Beispiel ZIP. Die entscheidenden Zeilen sind:
static int serial_write(char c, FILE *unused)
{
   ...
}

static FILE serialPort = FDEV_SETUP_STREAM(serial_write, 0, _FDEV_SETUP_WRITE);

stdout = &serialPort;

: Bearbeitet durch User
von Karl M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke Stefan,

die Verbindung habe ich nicht herstellt.

von Schorsch (Gast)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
So hab ich das gemacht........
void sputchar(char c)
{
  c = ~c;                                       // complement to send 0 = stop bit(s)
  STXD_oe = 1;                                  // output
  STXD = MARK;                                  // start bit
  for (uint8_t i = 9 + STOP_BITS; i; i--)       // start + data + stop bits
  {
    _delay_us(1e6 / BAUD);                      // bit duration
    if (c & 1)
      STXD = MARK;
    else
      STXD = !MARK;                             // = Space
    c >>= 1;                                    // next bits or stop bit(s)
  }
}

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)


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

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


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.