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.

Code:
'###################################################
'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
Fragen, Kommentare, etc ... Ihr wisst schon (Aber bitte noch nicht steinigen, lieber konstruktiv - ich möchte doch noch weiter machen )

Gruß
Searcher