Bascom ATmega8 Pin auf High liefert nur 1.8V?

Johnny Bravo

Neues Mitglied
31. März 2012
10
0
0
39
Sprachen
Hi Leute, ich hoffe ich bin im richtigen Unterforum, falls nicht bitte verschieben :)

Ich habe folgendes Problem:

Ich habe eine Schaltung aufgebaut, mit einer 7 Segment LED Anzeige (CA). Diese habe ich ohne IC direkt an einen ATmega8 angeschlossen, das funktioniert wunderbar.
Zusätzlich dazu habe ich 4 Taster angeschlossen, welche 4 Funktionen bereitstellen.
Pinb.0 = Erhöht die Zahl auf dem 7 Segment Display, bis 9.
Pinb.1 = Reduziert die Zahl auf dem 7 Segment Display, bis 0.
Pinb.2 = Setzt die Anzeige wieder auf 0.
Pinc.5 = Zählt von der eingestellten Zahl runter, und schaltet gleichzeitig solange Portc.0 auf High. (Der Pin soll ein Relais schalten)

Wie man vielleicht erkennen kann, handelt es sich um einen Countdown Timer, welcher zu der eingestellten Zeit auf dem 7 Segment Display ein Relais schalten soll.
Im Augenblick habe ich noch kein passendes Relais hier, darum schalte ich eine 20mA LED an Portc.0 (natürlich mit passendem Vorwiderstand für +5V)
Allerdings liefert der Portc.0 nur 1.8V, zuwenig für die LED und für das Relais - sollte hier schon ein Transistor das schalten übernehmen?

Zusätzlich wollte ich eine Blinkende "0" einbauen, wenn das Display nach dem runterzählen eine "0" anzeigt. Ich habe es versucht mit dem kompletten Port für die LED Anzeige auszuschalten - es blinkt aber nicht, sondern schaltet sich nur komplett aus und wieder an. Wie löse ich das am besten?

Hier mein Code bisher:

Code:
$regfile "m8def.dat"
$crystal = 1000000

Config Portb.0 ; Portb.1 ; Portb.2 ; Portc.5 = Input
Config Portc.0 ; Portc.4 = Output
Config Portd = Output


Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portc.5 = 1


Dim Dis(10) As Byte
Dim Cnt As Byte

Dis(1) = &B00111111                                         '0
Dis(2) = &B00000110                                         '1
Dis(3) = &B01011011                                         '2
Dis(4) = &B01001111                                         '3
Dis(5) = &B01100110                                         '4
Dis(6) = &B01101101                                         '5
Dis(7) = &B01111101                                         '6
Dis(8) = &B00000111                                         '7
Dis(9) = &B01111111                                         '8
Dis(10) = &B01101111                                        '9

Cnt = 1

Do
Portd = Dis(cnt)
 If Pinb.0 = 0 Then Gosub Plus
 If Pinb.1 = 0 Then Gosub Minus
 If Pinb.2 = 0 Then Gosub Rstbtn
 If Pinc.5 = 0 Then Gosub Prgstart
If Cnt = 5 Then
  Portc.0 = 1
 Else
  Portc.0 = 0
 End If
Loop
End

Plus:
 Portd = Dis(cnt) : Waitms 200
 Cnt = Cnt + 1
 If Cnt > 10 Then Cnt = 10
  Return

Minus:
 Portd = Dis(cnt) : Waitms 200
 Cnt = Cnt - 1
 If Cnt < 1 Then Cnt = 1
 Return

 Rstbtn:
 Cnt = 1
 Return

  Prgstart:
  Do
  Portc.0 = 1
  Portd = Dis(cnt) : Waitms 1000
  Cnt = Cnt - 1
 If Cnt = 1 Then
   Cnt = 1
   Waitms 500
   Portd = &B00000000
   Waitms 500
   Cnt = 1
   Waitms 500
   Portd = &B00000000
   Waitms 500
   Cnt = 1
   Waitms 500
   Portd = &B00000000
   Waitms 500
   Exit Do

  End If
 Loop
Return

Danke :)
 
Config Portb.0 ; Portb.1 ; Portb.2 ; Portc.5 = Input
Config Portc.0 ; Portc.4 = Output
Hallo Johnny,
diese Kurzform sieht zwar gut aus, funktioniert aber leider nicht.
Also entweder alle einzeln oder den ganzen Port oder dass DDR Register für die entsprechenden Bits setzen.

Wo machst du das mit dem Blinken für die 0?
 
Hallo Johnny,

hast du AVCC an VCC angeschlossen? Die Ausgangstreiber von PORTC werden darüber versorgt. Auch wenn du den ADC nicht verwendest, AVCC immer anschließen.

Ansonsten sollte jeder IO-Pin bei VCC 5,0V 20mA schalten können (sink/source).

Bei Bascom kann ich dir leider nicht weiter helfen, da ich nicht mit Bascom programmiere.

Dirk :ciao:
 
Hi for_ro,

danke das war der Fehler gewesen. Ich habe Portc.0 einzeln als Output deklariert, das funktionert jetzt wunderbar mit der LED.
Die blinkende "0", (wenn man das so nennen kann :D) ist im Sub PrgStart zu finden. Wie gesagt, es schaltet den Port auf Low und die Variable CNT auf 1, welches einer 0 auf dem Display entspricht. Jedenfalls sollte es das ;)

Danke.
 
Hallo,

Allerdings liefert der Portc.0 nur 1.8V, zuwenig für die LED und für das Relais - sollte hier schon ein Transistor das schalten übernehmen?
Code:
Config Portb.0 ; Portb.1 ; Portb.2 ; Portc.5 = Input
Config Portc.0 ; Portc.4 = Output
Config Portd = Output


Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portc.5 = 1
Tu dir nen Gefallen und schreib das mit den Definitionen für die Ports in einzelne Zeilen.

Code:
Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portc.5 = Input
Config Portc.0 = Output
Config Portc.4 = Output
Config Portd = Output

oder so wie ich es immer mache ...
ein BEISPIEL! ...
Code:
' ===== PortB =================================================================
' I=7=  I=6=  O=5= I=4= O=3= O=2= O=1= O=0=  => 00101111 => DDRB
' XTAL2 XTAL1 SCK  MISO MOSI /SS   RS   E    => 00010000 => PORTB (init)
'   |     |    |    |    |    |    |    |
'
Ddrb = &B0010_1111
Portb = &B0001_0000

' ===== PortC =================================================================
' I=7= I=6=  I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRC
' ---- Reset SCL  SDA  ---- ---- ---- ----  => 00111111 => PORTC (init)
'   x    x    |    |    |    |    |    |
'
Ddrc = &B0000_0000
Portc = &B0011_1111

' ===== PortD =================================================================
' O=7= O=6= O=5= O=4= I=3= I=2= O=1= I=0=  => 11110010 => DDRD
' LCD7 LCD6 LCD5 LCD4 INT1 INT0 TxD  RxD   => 00001101 => PORTD (init)
'   |    |    |    |    |    |    |    |
'
Ddrd = &B1111_0010
Portd = &B0000_1100
'

Ich weiß nicht ob Bascom deine Version richtig interpretiert. Ich hab da auch schon schöne Erlebnisse gehabt. Es könnte sein das bei dir der PinC0 auf Eingang steht und der PullUp aktiv ist. Dann hast du noch den PullUp-Widerstand in Reihe zu deinem Vorwiderstand und der LED. Daher evtl die niedrige Spannung am Pin. Bei meiner Verison weiß ich definitiv das die Pins genau so eingestellt sind wie ich es haben will.

Gruß
Dino
 
Bitte bedenkt dabei, daß die Datenrichtungsbits eines Ports in einem Register liegen. Ich kann mir nicht vorstellen, daß Bascom aufeinanderfolgende Config-Befehle, die dasselbe Register betreffen, sinnig optimiert. Config Portb.x = output setzt das entsprechende Bit im PORTB-Register. Entweder mit SBI, oder (was wahrscheinlicher ist) als RMW (laden in ein Rechenregister, mit einer Maske verORren, zurückschreiben). Das sind 3 1-Takt-Instruktionen. Entsprechen also 3 mal SBI. Ab dem 4ten Bit wäre also RMW besser. Konfiguriert man einzeln mehrere Pins (desselben Ports), fallen diese Schritte jetzt vielleicht sogar mehrfach an. Da man jedoch eigentlich alle Bits eines Ports in einem Rutsch initialisieren will (->Dino), kann man auf das Read verzichten, also direkt alle Bits in ein Rechenregister laden, und ins I/O-Register kopieren. Das sind 2 1-Takt-Instruktionen.
In Bascom wird das durch "Ddrx=0bmmmmmmmm" mit x=[a,b,c,d...] und m=[0,1] (0=input,1=output) erledigt.
Für die Pegel analog durch "Portx=0bmmmmmmmm".
 
Danke euch. Wie ich schon schrieb, nachdem ich jetzt jeden Port einzeln als Input/Output deklariert habe, funktioniert alles so wie es soll, und die vollen 5V liegen nun an :)
 
Danke euch. Wie ich schon schrieb, nachdem ich jetzt jeden Port einzeln als Input/Output deklariert habe, funktioniert alles so wie es soll, und die vollen 5V liegen nun an :)

Also war der IO-Pin auf Input und mit aktiviertem Pull-Up. Klar das eine LED dann nur noch glimmt (wenn man genau hinsieht).
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)