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 ?
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
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
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.
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.
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; |
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; }
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.