Hallo,
hab mal den Titel des threads geändert, da ich noch kein festes Ziel verfolge sondern eigentlich nur als Anfänger noch experimentiere.
Als neues Feature auf dem Steckbrett habe ich nun eine RS232 Verbindung zum PC geschaffen. Anleitung nach der BASCOM-AVR Hilfe unter "Using the UART".
Der HW Aufbau war überhaupt kein Problem und hat sofort funktioniert. Das Beispielprogramm für SW UART lief auch sofort nach Weglassen des $baud und Anpassen der Portpins in der OPEN Anweisung.
Weil das fehlerfreie Empfangen der Zeichen auf dem µC aber nicht sehr zuverlässig ist, begab ich mich auf die Suche durch verschiedene threads und hab mich dann zur Verwendung des Pin Change Interrupt entschieden. Der wird zwar öfter ausgelöst als notwendig; zunächst reicht das aber für mich.
Die Aktivierung des PCI auf Pin PB4 hat mich "einige" Schleifen durch Datenblatt, Bascom Hilfe, Simulator und Tests drehen lassen. Zusammenfassend: Da könnte die Bascom Hilfe und insbesondere auch die attiny45.dat verbessert werden. (Keine Ahnung, ob das in der neuesten Vollverion schon OK ist) Dazu einige Remarks in dem Testprogramm.
Fragen, Kommentare, etc ... Ihr wisst schonCode:'################################################### 'File: SW_UART.bas 'IDE: BASCOM-AVR Demo Version 1.11.9.8 'Tests on three wire software spi - output only 'SW UART 'UART - Inputs at terminal are echoed back to terminal 'and displayed at 7 segment in HEX ASCII 'Displayunit: 4 X 7 segment low current LED 'HW circuit: ATtiny45_4_X_7_Segment_SPI (UART still missing) '####################################################### $regfile = "attiny45.dat" $eepleave $framesize = 32 $swstack = 32 $hwstack = 64 'hwstack reichlich wg Interruptroutine $crystal = 8000000 Dim B As Byte Dim X As Byte Dim Y As Byte Dim Init7segment As Byte Dim Dunkelziffer As Byte Dim Displaydigit(16) As Byte 'darzustellende Zeichen (hex 0..F) '0gfedcba (segmente, msb immer 0) Displaydigit(1) = &B01000000 'Ziffer "0", 0 = segment ein, 1 = aus Displaydigit(2) = &B01111001 'Ziffer "1" Displaydigit(3) = &B00100100 'Ziffer "2" Displaydigit(4) = &B00110000 Displaydigit(5) = &B00011001 Displaydigit(6) = &B00010010 Displaydigit(7) = &B00000010 Displaydigit(8) = &B01111000 Displaydigit(9) = &B00000000 Displaydigit(10) = &B00010000 Displaydigit(11) = &B00001000 Displaydigit(12) = &B00000011 Displaydigit(13) = &B01000110 Displaydigit(14) = &B00100001 Displaydigit(15) = &B00000110 Displaydigit(16) = &B00001110 Dunkelziffer = &B01111111 'Wert um eine Ziffer dunkel zu schalten Init7segment = &B11111111 'Wert um Anzeige zu initialisieren 'Nutzung von Software SPI Config Spi = Soft , Dout = Portb.0 , Ss = Portb.1 , Clock = Portb.2 Spiinit 'TRANSMIT Kanal für SW UART Ausgabe öffnen Open "comb.3:19200,8,n,1" For Output As #1 'comb.3 -> TX ist Pin PB3 'RECEIVE Kanal für SW UART Empfang öffnen Open "comb.4:19200,8,n,1" For Input As #2 'RX ist PB4 Pcmsk = &B00010000 'Pin Change Interrupt PCINT4 auf Pin PB4 erlauben On Pcint0 Isr_inkey 'Spring zur ISR wenn PCIF (Pin Change Int. Flag) in GIFR gesetzt ist Enable Interrupts 'Setzt Global Interrupt Enable in SREG Enable Pcint0 'Setzt PCIE (Pin Change Interrupt Enable) in GIMSK Register '########################################################################################## 'So könnte es bei Änderung der attiny45.dat auch gehen (keine sonstigen Konsequenzen getestet!!!) 'PCMSK = PCINT4 'On PCINT Isr_inkey 'Enable Interrupts 'Enable PCINT '########################################################################################## 'mit Senden von acht high bits sicherstellen, daß über Q7 des Schieberegisters 'der HEF4017 die erste Ziffer der 4 X 7 Segmentanzeige adressiert -> reset des 4017 Spiout Init7segment , 1 '4 x 7 Segment ständig mit Anzeigedaten versorgen (später mal in Timerinterrupt unterbringen) Do Spiout Dunkelziffer , 1 Spiout Dunkelziffer , 1 Spiout Displaydigit(x + 1) , 1 Spiout Displaydigit(y + 1) , 1 Loop Close #2 'Kanäle schließen Close #1 End 'ISR holt Zeichen vom UART wenn an RX Leitung ein Pegelwechsel erkannt wurde 'Ausführung der ISR setzt PCIF in GIFR automatisch zurück Isr_inkey: B = Inkey(#2) 'Nur Ausführen, wenn Zeichen vollständig eingetroffen ist If B > 0 Then X = B Y = B Shift X , Right , 4 'Zeichen für 7 Segment aufbereiten - Shift Y , Left , 4 '- x und y mit high und low nibble versorgen Shift Y , Right , 4 Print #1 , Chr(b) ; " " 'Echo Zeichen zurück an Terminal End If Return(Aber bitte noch nicht steinigen, lieber konstruktiv - ich möchte doch noch weiter machen
)
Gruß
Searcher







Hoffentlich liegt das Ziel auch am Weg
Zitieren

Lesezeichen