den port als ausgang setzen könnte helfen:
gruesseCode:DDRB = (1 << PB2); // Pin PB2 als ausgang
Hallo Hubert.G
hoffentlich hat´s geschmeckt . Danke schon mal jetzt für Deine Mühe.
Ich habe das natürlich in Assembler getestet (mit demselben Aufbau ) - weil ich mir nicht über den Weg traue:
.. da geht die Leuchte an - und bleibt es auch.Code:;=================================================================================== ;* Schaltung ZU Test "erstes C-Programm" ###>>> t2313, auszugsweise ; ; Vcc -----------t2313-----+------------Vcc ; | ; | +------+ rLED|\ | ; +---+ 100R +-------| >+---+ ; +------+ |/ | | ; | ; t2313-PB1=pin13---------------------+ ; ; ; GND-------------------------------------------------GND ; ;=================================================================================== ; Speicherbelegung ;r16 Mehrzweck, high-Byte in Pausen "pause_an", "pause_aus", "led_ende" u.ä. ; ;=================================================================================== ; Deklarationen und Konstanten für den Praeprozessor #define a r16 ;Kurzbezeichung für Allzweckregister r16 ; ;=================================================================================== #include "tn2313def.inc" ; Interrupthandler-Tabelle (aus AT2313_doc2535.pdf, Seite 42) ; Address Code Labels ;Comments .org 0x0000 rjmp reset ;Reset Handler .org 0x0001 reti ; INT0 ;External Interrupt0 Handler .org 0x0002 reti ; INT1 ;External Interrupt1 Handler .org 0x0003 reti ; TIM1_CAPT ;Timer1 Capture Handler .org 0x0004 reti ; TIM1_COMPA ;Timer1 CompareA Handler .org 0x0005 reti ; TIM1_OVF ;Timer1 Overflow Handler .org 0x0006 reti ; TIM0_OVF ;Timer0 Overflow Handler .org 0x0007 reti ; USART0_RXC ;USART0 rX Complete Handler .org 0x0008 reti ; USART0_DRE ;USART0,UDR Empty Handler .org 0x0009 reti ; USART0_TXC ;USART0 TX Complete Handler .org 0x000A reti ; ANA_COMP ;Analog Comparator Handler .org 0x000B reti ; PCINT ;Pin Change Interrupt .org 0x000C reti ; TIMER1_COMPB ;Timer1 Compare B Handler .org 0x000D reti ;IRS für Timer0 CompareA Handler (t2313) .org 0x000E reti ; TIMER0_COMPB ;Timer0 Compare B Handler .org 0x000F reti ; USI_START ;USI Start Handler .org 0x0010 reti ; USI_OVERFLOW ;USI Overflow Handler .org 0x0011 reti ; EE_READY ;EEPROM Ready Handler .org 0x0012 reti ; WDT_OVERFLOW ;Watchdog Overflow Handler ; ;=================================================================================== ; Hauptprogramm ;=================================================================================== ; reset: ;=== Generelle Initialisierung ; Zuerst RAMEND und Stack definieren; ldi a,RAMEND ;Ram Ende des tiny2313 out SPL,a ;Stack Pointer tiny2313 setzen ; anfang: ;=== Nur ein Dummy-Hauptprogramm mit einer leeren Schleife ; rcall mc_init ;Initialisiere den Mikrocontroller ; sbi portb,2 ; anfang2: rjmp anfang2 ; ;=================================================================================== ; Prozeduren ;=================================================================================== ; ; ;=================================================================================== ; Initialisierungprozeduren, für µC, ADC und Timer-ISR ;=================================================================================== ; mc_init: ;=== Initialisiere Mikrocontroller ;ALLE Register initialisieren hier := pull-ups einschalten ; ldi a,0b11111111 ; ;Datenrichtung "Ausgänge" für ports 0 - 7 out ddrb,a ldi a,0b00000000 out portb,a ; ports aus-(=) oder ein(1)schalten; low = sink ret ;=====----->>>>> ; ;=================================================================================== ; Interrupt-Service-Routine ;=================================================================================== ; ;=================================================================================== ; Ende des Quellcodes ;===================================================================================
Ciao sagt der JoeamBerg
Dieser Code läuft bei mir:Wie schon erwähnt PORTB als Ausgang definieren und den UART richtig einstellen, du hast die Baudrate in den UBRRL und H geschrieben.Code:/* =========================================================== Aufgabe: Sende "Hallo Welt" über die RS232 UND LED auf PB2 anzünden Autor: JWT =========================================================== */ #include <stdlib.h> #include <avr/io.h> /* #include <avr/iotn2313.h> <<< das is ja wohl nix */ //#define MCU = attiny2313 // ### NEIN ### Mit Quarz 16 Mhz-CPU // Interner Oszillator, 8 MHz #define F_CPU 8000000 #define BAUD 9600 #define UBRR (unsigned int)(F_CPU / BAUD / 16 - 0.5) // ### Portinitialisierung und waitms aus RNContr Demo C // *### Ports setzen ### // Ports auf HIGH/LOW setzen static inline void setportbon(const uint8_t n) {PORTB |= (1<<n);} //set PORTB.n high static inline void setportboff(const uint8_t n) {PORTB &= ~(1<<n);} //set PORTB.n low /*### Programm pausieren lassen ###*/ /*Pausenwert ist nur experimentell !*/ void waitms(uint16_t ms) { for(; ms>0; ms--) { uint16_t __c = 4000; __asm__ volatile ( "1: sbiw %0,1" "\n\t" "brne 1b" : "=w" (__c) : "0" (__c) ); } } // ------------------------------------------------------------------ // Dieser Codeschnipsel ähnlich 2313-doc, S 121 void USART_Init( unsigned int baud ) { /* Set baud rate */ UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (3<<UCSZ0); } // ------------------------------------------------------------------ void sendchar(unsigned char c) { while(!(UCSRA & (1<<UDRE))) //Warten, bis Senden möglich ist { } UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle } // ------------------------------------------------------------------ void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei // einem String werden die Zeichen (char) // einzeln ausgelesen - und auf die // Sendeschnittstelle übertragen { while(*s) { sendchar(*s); s++; } } // ------------------------------------------------------------------ /*### Hauptschleife ###*/ int main(void) { USART_Init(UBRR); //USART initialisieren DDRB=0xff; // for(uint8_t i=0; i<10; i++) for(;;){ setportboff(2); waitms(150); setportbon(2); /*###Text senden###*/ sendUSART("\r\n\n\n"); //Sendet Kenung und Text. // "\r" setze Cursor auf Zeilenanfang, // "\n" beginnt dann die nächste Zeile sendUSART("**** ATtiny2313 *****\r\n"); sendUSART(" \r\n"); sendUSART("Hallo, Welt.\r\n"); sendUSART(" \r\n"); } }
Edit: Ich habe auf 1Stopbit geändert
Erstmal vielen Dank. Ich "muss noch was tun" - und gehe es später ausprobieren, korrigieren und Fehlerdiskussion
Danke
Ciao sagt der JoeamBerg
Hallo Hubert.G, hei robocat,
nochmals vielen Dank, Euch beiden. Ich habe den Code von Hubert.G 1:1 übernommen: Die LED blinkt - das Hyperterminal zeigt GARNIX an - der RS232-Monitor in DASYLab (ein kleiner Verwandter von LabView) zeigt folgenden Text:
Aufgenommen mit einem RS232-Monitor (DASYLab)
<LF>**** ÁÔôiny2313 ****ªŠ€Š¨±¼ï Welt.<CR><LF>
<CR><LF>
<CR><LF>
<LF>
<LF>**** ATôiþ<CR><LF>
<LF>
<LF>**** ATtiny2313 *****Š ŠÈallo, Welt.<CR><LF>
<CR><LF>
andere Sequenz (später) bei gleicher Hardware
<LF>
<LF>**** ÁÔ´éîy2313 ****ªŠ‚¤±´´•”§µ´¼ž…†‡‚<CR><LF>
<LF>
<LF>**** Á”´©®¹2³13 *****Š‚¤±´•”§µ´¼–…„Cá<CR><LF>
<LF>
<LF>**** Á”´©®ù2313 *****ŠŠ ±´¼¿œ€—¥ô®Š…Š<CR><LF>
<LF>
<LF>**** ATôiny2313 *****þ
Da ich als elektro(schaltungs)technisches Wickelkind die ganze Schaltung mit dem MAX232 selbst aufgebaut habe (angelehnt an hiesige Threads und RN-Control) könnte es an der Elektronik liegen. Der Oskar (leider kein DSO ) zeigt bei der RN-Control +/- 8V an, bei meinem Oevre -9V und zwei positive "Spuren" irgendwo in der Nähe von +3 bzw +8 V (siehe Bild).
Nach Umlöten des Elko von max232_2 nach Vcc kam dann das:
Š
**** ATôiny2313 *****
Hallo, Welt.
¹
aber nur ein Mal.
Nun sind die Schaltvorschläge zum max232 natürlich nicht eindeutig. Das Beispiel https://www.roboternetz.de/wissen/im...schaltplan.gif
zeigt mir beim max232_2 einen Elko der mit dem (-)-Anschluss nach Vcc geht ?? Die Bestückung an 1, 2, 3, 4, 5 und 6 sieht 4,7 müF vor. Dagegen sind bei den Thread von pmaler, bzw. bei http://www.pherzog.de/streifenrastermega32/ am max232 22 müF gesetzt, der max232_2 geht mit (+) nach Vcc. Ich hatte mich an der Streifenrasterplatine orientiert, meine Bauteile sind nach dieser Stückliste. Das Datenblatt zu dem von mir verwendeten MAX 232 CPE http://www.reichelt.de/?;ACTION=7;LA...5caa274be49a9d sieht aber andere Kapazitäten vor .
Mein Signalausgang am 2313 sieht recht gut aus, sauber zwischen 0V und +5V. Dieses Spannungsplateau bei +3V nach dem max232 sollte also irgendwo zwischen 2313 und RS232-Stecker passieren . Der Oskar zeigt die Pegel bei der RN-Control sauber und eindeutig zwischen -8V und +8V.
Ich muss mir die Hardware mal durch den Kopf gehen lassen.
Das Dümmste ist, dass ich mir diese Schnittstelle für die Erprobung von Teilprojekten in den Kopf gesetzt hatte - später sollte ich dann I2C nehmen (dann gibts wohl neue Probleme).
Ciao sagt der JoeamBerg
hi joe,
der elko an pin 2 vom max muss mit (-) an die 5V versorgung. und der an pin 6 mit (+) auf masse. das liegt daran, dass -10V gegenüber 0V negativer sind, und die 5V negativer als +10V. im zweifelsfall ins datenblatt gucken http://www.ortodoxism.ro/datasheets/...220-MAX249.pdf. die elkos sind normalerweise nicht kritisch, bei mir hat bisher alles zwischen 1µF und 4,7µF klaglos dienst getan.
windows verwendet normal \r\n als zeilenumbruch, manche programme (dasylab?) wollen aber nur ein \n.
gruesse von der katz
Hast du im Hyperterminal auf 1Stopbit geändert, sonst kann noch sein das die Frequenz den internen Oszillator nicht stimmt. Die ist etwas Spannungs- und Temperaturabhängig.
Bei mir läuft es auch im Hyperterminal einwandfrei.
Ob diese beiden Elkos gegen + oder - geschalten sind ist egal solange die Spannungsfestigkeit stimmt.
Schönen Abend, Hubert.G
Ja, 1, 1 1/2 und 2. Was man halt so tut, wenn man nix Genaues nicht weiss.Zitat von Hubert.G
Da bin ich grad dran. Bei meinem tiny13 hatte ich mit einer (Assembler-) Soft-RS232 mit dem internen Oszillator GELEGENTLICH mal einen Treffer . Aber ich hab die Sachen zusammengesucht und löte mir die notwendigen Kondensatoren rein und stecke einen Quarz dazu. Steht sowieso auf der Liste.Zitat von Hubert.G
Ohhh - danke.Zitat von Hubert.G
Ciao sagt der JoeamBerg
Nachtrag zu den Elkos, die Polarität gehört natürlich schon eingehalten, die ändert sich nicht.
Mit den Kapazitäten von 4µ7 bist du bei einem MAX232 gut dabei. Meist genügt 1µ oder sogar 0,1µ, da ist allerdings ein Blick ins Datenblatt angesagt und dabei genau auf die Bezeichnung achten.
Lesezeichen