Learning BASCOM - Lernen von Anfang an

dino03

Aktives Mitglied
27. Okt. 2008
6.760
20
38
Sprachen
  1. BascomAVR
  2. Assembler
Hallo zusammen,

mein Bascom-Einstieg :D

Da meine GLCD-Versuche ja kläglich gescheitert sind :rolleyes: versuch ich
mal das von Grund auf zu machen. Eins nach dem anderen ...

Ich hab mir ja ein Pollin-Board nachgebaut und weil das so einfach ist und
dieses Board auch bei anderen wohl anscheinend zur Genüge vorhanden ist
werde ich meine Versuche auf dieses Board abstimmen.

Ich werde PortD mit den Tastern, den LEDs und der RS232 beschaltet lassen
damit man da nix umstecken muß. Das EEPROM ist bei mir nicht gesteckt und
die Brücken für den I2C sind draußen (erstmal). Ich habe also PortA und PortC
vollständig zur Verfügung. PortB ist bis auf die Einschränkungen des ISP auch
komplett verwendbar. Die Programme schreibe ich auf nem ATmega8535. Der
ist soweit kompatibel mit dem ATmega16 oder ATmega32. Er hat allerdings
recht wenig Speicher. Was auf dem läuft, das läuft also auch auf dem
16 oder dem 32.

Zuerst hab ich mal nen Programm geschrieben um die gesamten Ports zu
testen. Ich hab mir nen kleinen Adapter gebastelt auf dem sich 8 LEDs
befinden die mir die Bits anzeigen können. Den steck ich dann von Port zu
Port um zu sehen ob denn alles läuft.

Hier nun das Testprogramm ...



CodeBox BASCOM

' Testprogramm für mein Pollin-Nachbau-Board
' Es werden nacheinander alle Portbits auf 1 gesetzt
' Sieht also wie ein Lauflicht aus.

' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################

' Prozessor ATmega8535 (lag grade so rum)
$regfile = "m8535.dat"
' Prozessor ATmega16 (wers braucht)
' $regfile = "m16def.dat"
' Prozessor ATmega32 (wers braucht)
' $regfile = "m32def.dat"

' 16MHz Quarztakt
$crystal = 16000000

' Hab ich abgekupfert ;-)
$hwstack = 128
$swstack = 128
$framesize = 128


' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################


' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================

' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang

' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an

' PINx => Eingang (Pin abfragen)

' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================

' === PortB ============================
' PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
' SCK MOSI MISO - - - - -
' Alle Portbits können verwendet werden
' Bei PB5..7 aber Einschränlung wegen ISP
Ddrb = &B1111_1111
Portb = &B0000_0000
' ======================================

' === PortC ============================
' PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
' - - - - - - SDA SCL
' Alle Portbits können verwendet werden
' Bei I2C-Bus (TWI) sind PC0+1 aber belegt
Ddrc = &B1111_1111
Portc = &B0000_0000
' ======================================

' === PortD ============================
' PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
' Buz LD2 LD1 T3 T2 T1 TxD RxD
' Hier sind beim Eval-Board Taster, LEDs
' Buzzer und RS232 dran
Ddrd = &B1110_0000
Portd = &B0000_0000
' ======================================


' #############################################################################
' ##### Hauptschleife #########################################################
' #############################################################################

Do

' 500ms warten
Waitms 500
' Alle Bit0 der Ports auf 1
Porta = &B0000_0001
Portb = &B0000_0001
Portc = &B0000_0001
Portd = &B0000_0001

Waitms 500
' Alle Bit1 der Ports auf 1
Porta = &B0000_0010
Portb = &B0000_0010
Portc = &B0000_0010
Portd = &B0000_0010

Waitms 500
' Alle Bit2 der Ports auf 1
Porta = &B0000_0100
Portb = &B0000_0100
Portc = &B0000_0100
Portd = &B0000_0100

Waitms 500
Porta = &B0000_1000
Portb = &B0000_1000
Portc = &B0000_1000
Portd = &B0000_1000

Waitms 500
Porta = &B0001_0000
Portb = &B0001_0000
Portc = &B0001_0000
Portd = &B0001_0000

Waitms 500
Porta = &B0010_0000
Portb = &B0010_0000
Portc = &B0010_0000
Portd = &B0010_0000

Waitms 500
Porta = &B0100_0000
Portb = &B0100_0000
Portc = &B0100_0000
Portd = &B0100_0000

Waitms 500
Porta = &B1000_0000
Portb = &B1000_0000
Portc = &B1000_0000
Portd = &B1000_0000

Loop

End

' #############################################################################
' ##### Programmende ##########################################################
' #############################################################################


Es ist nicht schön aber es funktioniert ;) Man könnte es natürlich auch über
Variablen auf einen Bruchteil zusammenkürzen ... aber egal.

Hier mein Testprogramm zum Download ...
Anhang anzeigen Port-Test.bas

So sieht der Testaufbau aus ...
P1030738.JPG
Ein AVRISPmk2, nen kleiner Adapter für die Anpassung von 6pin-ISP auf
10pin-ISP, das nachgebaute Pollin-Eval-Board und ein Port-Tester

und das ist mein Adapter mit den 8 LEDs. Nen Schaltplan kann ich ja noch
als Anhang dransetzen (später mal ...)
P1030739.JPG P1030740.JPG
damit kann man Hardwaredefekte der IO-Ports erkennen oder auch einfach
nur nen paar Bits anzeigen.

EDIT: ... so, hier ist der Schaltplan ...
STK500-LED-Adapter.png
Wenn ich mal Lust habe wird der gemeinsame Anschluß der LEDs nochmal von
einem OPAmp auf 2,5V gehalten. Dann ist über den Jumper dieser gemeinsame
Pol umschaltbar ...
* 4V
* 2,5V
* 1V
damit kann man dann entweder nur die grünen, nur die roten oder alle LEDs
einschalten und die Ports auf saubere Durchschaltung von GND und Vcc oder
hochohmig testen.

EDIT: hier ist der fertige Port-Tester

Gruß
Dino
 
Hi Dino,

hab ich das jetzt richtig verstanden? DU fängst JETZT erst mit Bascom an? :eek:
 
Hallo,

hab ich das jetzt richtig verstanden? DU fängst JETZT erst mit Bascom an? :eek:
genau richtig erkannt ... Als Profi fängt man ja auch mit Assembler an :D :rolleyes:
Nur bei FloatingPoint hatte ich in Assembler keine Lust mehr ;) Also mußte
ne "Hochsprache" her mit der das einfacher geht ... :p

Hier mal mein 2tes Progrämmchen ...


CodeBox BASCOM

' Testprogramm für mein Pollin-Nachbau-Board
' Es werden nacheinander alle Portbits auf 1 gesetzt
' Sieht also wie ein Lauflicht aus.

' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################

' Prozessor ATmega8535 (lag grade so rum)
$regfile = "m8535.dat"
' Prozessor ATmega16 (wers braucht)
' $regfile = "m16def.dat"
' Prozessor ATmega32 (wers braucht)
' $regfile = "m32def.dat"

' 16MHz Quarztakt
$crystal = 16000000

' Hab ich abgekupfert ;-)
$hwstack = 128
$swstack = 128
$framesize = 128


' #############################################################################
' ##### Variablen #############################################################
' #############################################################################

' Was Byte-mässiges
Dim A As Byte
A = 1


' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################


' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================

' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang

' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an

' PINx => Eingang (Pin abfragen)

' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================

' === PortB ============================
' PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
' SCK MOSI MISO - - - - -
' Alle Portbits können verwendet werden
' Bei PB5..7 aber Einschränkung wegen ISP
Ddrb = &B1111_1111
Portb = &B0000_0000
' ======================================

' === PortC ============================
' PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
' - - - - - - SDA SCL
' Alle Portbits können verwendet werden
' Bei I2C-Bus (TWI) sind PC0+1 aber belegt
Ddrc = &B1111_1111
Portc = &B0000_0000
' ======================================

' === PortD ============================
' PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
' Buz LD2 LD1 T3 T2 T1 TxD RxD
' Hier sind beim Eval-Board Taster, LEDs
' Buzzer und RS232 dran
Ddrd = &B1110_0000
Portd = &B0000_0000
' ======================================


' #############################################################################
' ##### Hauptschleife #########################################################
' #############################################################################

Do

' 500ms warten
Waitms 500
' Alle Bit0 der Ports auf 1
Porta = A
Portb = A
Portc = A
Portd = A

' A immer weiter verdoppeln
' 1 > 2 > 4 > 8 > 16 > 32 > 64 > 128 > 256
A = A * 2

' Wenn A mal etwas außer Kehr ist muß A auf einen
' definierten Wert gesetzt werden. Also 1 als Anfang
' für die Reihe der 2er Potenzen
If A = 0 Then A = 1
If A > 128 Then A = 1

Loop

End

' #############################################################################
' ##### Programmende ##########################################################
' #############################################################################

da hab ich dann den ganzen Kram mit dem Lauflicht über ne Multiplikation
gemacht ... (ich weiß es gibt Shift-Operationen) ...
Hier als Download ... Anhang anzeigen L01_Variablen.bas

Eigentlich sind die Hochsprachen alle sehr ähnlich. Wenn man mal eine richtig
verstanden hat dann findet man sich auch in den anderen zurecht. Man muß
nur noch ein bischen an den Feinheiten der Syntax feilen. Das größte Problem
ist die Zerteilung der Aufgabe in Einzelteile und schließlich in die Befehle. Da
haben die meißten Leute ihre Probleme. Wenn das klappt ist alles andere
nur noch Spielkram und ein wenig Fleißarbeit :D

Und im Moment mach ich ein wenig Fleißarbeit damit ich in die Philosophie von
Bascom reinkomme. Das ist alles. Die Variablendeklaration am Anfang kenne
ich bereits von Pascal. Die prozessornahen Bitoperationen kenne ich von
Assembler. Basic habe ich auch schon mal programmiert (ZX Spectrum).
Und den Rest quirle ich von PHP, Perl, C, Java (was man davon kennt) in
einem großen Topf zusammen. Also alles relativ einfach :cool:

Ich will jetzt nich großkotzig daherkommen aber die Vortschritte werden bei
mir (wenn es die Zeit zuläßt) durch die Vorbildung in anderen Sprachen eher
mit Siebenmeilenstiefeln zu messen sein.

Gruß
Dino
 
und hier ein Siebenmeilenstiefel ...
Da man die Bitbefehle bereits aus Assembler kennnt ... Hier der ROTATE-Befehl
also das Lauflicht jetzt auf Bitebene aufgehübscht ;)


CodeBox BASCOM

' Testprogramm für mein Pollin-Nachbau-Board
' Es werden nacheinander alle Portbits auf 1 gesetzt
' Sieht also wie ein Lauflicht aus.

' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################

' Prozessor ATmega8535 (lag grade so rum)
$regfile = "m8535.dat"
' Prozessor ATmega16 (wers braucht)
' $regfile = "m16def.dat"
' Prozessor ATmega32 (wers braucht)
' $regfile = "m32def.dat"

' 16MHz Quarztakt
$crystal = 16000000

' Hab ich abgekupfert ;-)
$hwstack = 128
$swstack = 128
$framesize = 128


' #############################################################################
' ##### Variablen #############################################################
' #############################################################################

' Was Byte-mässiges
Dim A As Byte
A = 1


' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################


' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================

' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang

' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an

' PINx => Eingang (Pin abfragen)

' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================

' === PortB ============================
' PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
' SCK MOSI MISO - - - - -
' Alle Portbits können verwendet werden
' Bei PB5..7 aber Einschränkung wegen ISP
Ddrb = &B1111_1111
Portb = &B0000_0000
' ======================================

' === PortC ============================
' PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
' - - - - - - SDA SCL
' Alle Portbits können verwendet werden
' Bei I2C-Bus (TWI) sind PC0+1 aber belegt
Ddrc = &B1111_1111
Portc = &B0000_0000
' ======================================

' === PortD ============================
' PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
' Buz LD2 LD1 T3 T2 T1 TxD RxD
' Hier sind beim Eval-Board Taster, LEDs
' Buzzer und RS232 dran
Ddrd = &B1110_0000
Portd = &B0000_0000
' ======================================


' #############################################################################
' ##### Hauptschleife #########################################################
' #############################################################################

Do

' 500ms warten
Waitms 500
' Alle Bit0 der Ports auf 1
Porta = A
Portb = A
Portc = A
Portd = A

' A um eine Bitposition rotieren (die schöne Version)
Rotate A , Left , 1

' == Beschreibung aus BASCOM-Referenz ==
' ROTATE var , LEFT/RIGHT[ , shifts]
' Rotate all bits one place to the left or right.
' Var : Byte, Integer/Word or Long variable.
' Shifts : The number of shifts to perform.
' The ROTATE statement rotates all the bits in the variable to the left
' or right. All bits are preserved so no bits will be shifted out of the
' variable. This means that after rotating a byte variable with a value
' of 1, eight times the variable will be unchanged. When you want to shift
' out the MS bit or LS bit, use the SHIFT statement.


' Wenn A mal etwas außer Kehr ist muß A auf einen
' definierten Wert gesetzt werden. Also 1 als Anfang
' für die Reihe der 2er Potenzen (Nur als Failsafe-Option)
If A = 0 Then A = 1

Loop

End

' #############################################################################
' ##### Programmende ##########################################################
' #############################################################################

und wieder als Anhang ... Anhang anzeigen L02_Rotate.bas

Viel Spaß beim nachprogrammieren und mitlernen ;)
 
Jetzt habe ich mal meine Assembler-Entprellroutine in Bascom nachgebaut.
Zur besseren Sichtbarmachung der internen Abläufe habe ich 100ms Pausen
eingebaut. Wenn man etwas auf dem Taster rumklickert kann man damit das
Prellen simulieren und genau sehen was in der Routine so abläuft.



CodeBox BASCOM

' Testprogramm für mein Pollin-Nachbau-Board
' Der Zustand von PinD2 (Taster1) wird in die Variable A geschoben
' Variable A wird dann binär auf PortC ausgegeben.
' Ich habe damit versucht meine Entprell-Routine aus Assembler im Prinzip
' nachzubauen. Zur Sichtbarmachung habe ich eine Wartezeit von 100ms eingebaut.
' Da sieht man natürlich keinen Prellvorgang mehr. Richtig funktionieren wird
' sie erst unter voller Systemgeschwindigkeit.

' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################

' Prozessor ATmega8535 (lag grade so rum)
$regfile = "m8535.dat"
' Prozessor ATmega16 (wers braucht)
' $regfile = "m16def.dat"
' Prozessor ATmega32 (wers braucht)
' $regfile = "m32def.dat"

' 16MHz Quarztakt
$crystal = 16000000

' Hab ich abgekupfert ;-)
$hwstack = 128
$swstack = 128
$framesize = 128


' #############################################################################
' ##### Variablen #############################################################
' #############################################################################

' Was Byte-mässiges
Dim A As Byte
A = 1


' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################


' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================

' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang

' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an

' PINx => Eingang (Pin abfragen)

' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================

' === PortB ============================
' PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
' SCK MOSI MISO - - - - -
' Alle Portbits können verwendet werden
' Bei PB5..7 aber Einschränkung wegen ISP
Ddrb = &B1111_1111
Portb = &B0000_0000
' ======================================

' === PortC ============================
' PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
' - - - - - - SDA SCL
' Alle Portbits können verwendet werden
' Bei I2C-Bus (TWI) sind PC0+1 aber belegt
Ddrc = &B1111_1111
Portc = &B0000_0000
' ======================================

' === PortD ============================
' PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
' Buz LD2 LD1 T3 T2 T1 TxD RxD
' Hier sind beim Eval-Board Taster, LEDs
' Buzzer und RS232 dran
Ddrd = &B1110_0000
Portd = &B0000_0000
' ======================================


' #############################################################################
' ##### Hauptschleife #########################################################
' #############################################################################

Do

Waitms 100

' Da es in Bascom keinen SHIFT-Befehl gibt der mit dem in Assembler
' vergleichbar ist mußte ich ein wenig improvisieren ...

' Also Variable um 1 Bit nach links schieben ( X<--B7<B6<B5<B4<B3<B2<B1<B0<--0 )
' Bit 7 fällt aus der Variablen raus und in Bit 0 wird eine Null geschoben
Shift A , Left , 1

' Wenn PinD.2 gesetzt ist (Taster 1 gedrückt) dann
If Pind.2 = 1 Then
' Setze Bit 0 in Byte-Variable A
Set A.0
End If

' Variable binär auf PortC ausgeben
Portc = A

' Nur 1-Bits eingeschoben => Taster vollständig gedrückt, Prellen hat aufgehört
If A = 255 Then
' LED 1 anschalten
Portd.5 = 1
End If

' Nur 0-Bits eingeschoben => Taster vollständig geöffnet, Prellen hat aufgehört
If A = 0 Then
' LED 1 ausschalten
Portd.5 = 0
End If

Loop

End

' #############################################################################
' ##### Programmende ##########################################################
' #############################################################################

und wieder der Download ... Anhang anzeigen L03_Shift.bas

Man kann auch gleich die Funktion des SHIFT-Befehls und Bitmanipulationen
an Variablen sehen.

In Assembler habe ich das etwas eleganter über den Rotate-Befehl gemacht
über den man das Carry-Bit in ein 8Bit-Register einschieben kann. In das
Carry-Bit hat man dann vorher den Status des Port-Pins übernommen. Wie
gesagt ... etwas eleganter und kürzer ;)
 
Hallo Dino!

Wie ich sehe, machst du tatsächich ernst mit BASCOM lernen! :eek:

Gerade du als alter Hase in Assembler wirst dich betimmt schnell einarbeiten können. ;)

Zumindest lassen das deine "Lektionen" erahnen.
So große Schritte wird wohl ein echter Anfänger nicht wirklich machen. ;)

Ist aber nett zu lesen und anszusehen.
Außerdem bleibt alles besser im Gehirn, wenn man es vernünftig aufschreibt. ;)


Du wirst die investierte Zeit in BASCOM auch bestimmt nicht bereuen....
zumal du später teilweise Assembler in BASCOM auch direkt einbinden kannst.
(oder für uns Libs schreiben :D )

Viel Spaß weiterhin und schöne Grüße :ciao:
Cassio
 
Das erste LCD läuft !!!!!

Man war das ein Krampf :(

Hier erst mal das Programm ...


CodeBox BASCOM

' Testprogramm für mein Pollin-Nachbau-Board
' Der Zustand von PinD2 (Taster1) wird in die Variable A geschoben
' Variable A wird dann binär auf PortC ausgegeben.
' Ich habe damit versucht meine Entprell-Routine aus Assembler im Prinzip
' nachzubauen. Zur Sichtbarmachung habe ich eine Wartezeit von 100ms eingebaut.
' Da sieht man natürlich keinen Prellvorgang mehr. Richtig funktionieren wird
' sie erst unter voller Systemgeschwindigkeit.
' Nach nervenzermürbender Sucherei läuft auch ein LCD am PortB. Warum das Ding
' nicht am PortA läuft weiß ich beim besten Willen nicht, da PortA sonst ohne
' Probleme LEDs ansteuern kann und elektrisch fehlerfrei arbeitet.

' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################

' Prozessor ATmega8535 (lag grade so rum)
' 8k Flash, 512Byte SRAM, 512Byte EEPROM
$regfile = "m8535.dat"

' Prozessor ATmega16 (wers braucht)
' $regfile = "m16def.dat"

' Prozessor ATmega32 (wers braucht)
' $regfile = "m32def.dat"

' 16MHz Quarztakt
$crystal = 16000000

' Hab ich abgekupfert ;-)
$hwstack = 32
$swstack = 10
$framesize = 40

' #############################################################################
' ##### Variablen #############################################################
' #############################################################################

' Was Byte-mässiges
Dim A As Byte
A = 1



' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################


' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================

' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang

' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an

' PINx => Eingang (Pin abfragen)

' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================

' === PortB ============================
' PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
' SCK MOSI MISO - - - - -
' Alle Portbits können verwendet werden
' Bei PB5..7 aber Einschränkung wegen ISP
Ddrb = &B1111_1111
Portb = &B0000_0000
' ======================================

' === PortC ============================
' PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
' - - - - - - SDA SCL
' Alle Portbits können verwendet werden
' Bei I2C-Bus (TWI) sind PC0+1 aber belegt
Ddrc = &B1111_1111
Portc = &B0000_0000
' ======================================

' === PortD ============================
' PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
' Buz LD2 LD1 T3 T2 T1 TxD RxD
' Hier sind beim Eval-Board Taster, LEDs
' Buzzer und RS232 dran
Ddrd = &B1110_0000
Portd = &B0000_0000
' ======================================

' === LCD-Initialisierung ==============
' Umschaltbyte für Anzeige : 0 = Chip 1 / 1 = Chip 2
Dim ___lcdno As Byte
' with the config lcdpin statement you can override the compiler settings
Config Lcd = 40 * 4

' LCD an PORT-A läuft nicht ! Keine Ahnung warum :-(
'Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , E2 = Porta.5 , Rs = Porta.6

' LCD an PORT-B läuft sofort problemlos
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , E2 = Portb.5 , Rs = Portb.6

Config Lcdbus = 4

' === oberen Chip 1 einschalten und initialisieren ===
___lcdno = 0
Initlcd
Cls
' === unteren Chip 2 einschalten und initialisieren ===
___lcdno = 1
Initlcd
Cls
' ======================================



Lcd "Moins ! "



' #############################################################################
' ##### Hauptschleife #########################################################
' #############################################################################

Do

Waitms 100

' Da es in Bascom keinen SHIFT-Befehl gibt der mit dem in Assembler
' vergleichbar ist mußte ich ein wenig improvisieren ...

' Also Variable um 1 Bit nach links schieben ( X<--B7<B6<B5<B4<B3<B2<B1<B0<--0 )
' Bit 7 fällt aus der Variablen raus und in Bit 0 wird eine Null geschoben
Shift A , Left , 1

' Wenn PinD.2 gesetzt ist (Taster 1 gedrückt) dann
If Pind.2 = 1 Then
' Setze Bit 0 in Byte-Variable A
Set A.0
End If

' Variable binär auf PortC ausgeben
Portc = A

' Nur 1-Bits eingeschoben => Taster vollständig gedrückt, Prellen hat aufgehört
If A = 255 Then
' LED 1 anschalten
Portd.5 = 1
End If

' Nur 0-Bits eingeschoben => Taster vollständig geöffnet, Prellen hat aufgehört
If A = 0 Then
' LED 1 ausschalten
Portd.5 = 0
End If

Lcd "."

Loop

End

' #############################################################################
' ##### Programmende ##########################################################
' #############################################################################

und der Download ... Anhang anzeigen L04_LCD.bas
so eine Sch... :hmpf: :stupid: :angry: Ich daddel hier stundenlang rum und
such Fehler und surf im Internet um rauszukriegen was da falsch ist ...
ES IST NIX FALSCH ! Das Display läuft NICHT an diesem verd... Port A aber
an Port B läuft es sofort und fehlerfrei. Keine Ahnung warum :stupido3:
Weil an PortA die LEDs ohne Probleme alle angesteuert werden können. Wenn
ich den LED-Adapter an PortA stecke sehe ich das Gezappel von der Initialisierung
des LCDs.
P1030741.JPG P1030742.JPG
Der Beweis ... es läuft ...
Am Anfang hab ich echt gedacht das ich mich verlötet hab oder das ich zu
blöd bin son paar Zeilen da reinzutippen ... So eine Ka..e !

Gruß
Dino
 
Ich hab da was im Bascom-Forum gefunden ...
Für LCD -Displays mit 2 E anschlüssen.
Der Anschlußport für das Display ist bei Verwendung der lcd4e2.lbx Lib vorgegeben.
Müsten also bei einer Portänderung in der lib geändert werden.

Zitat
;This routine is called when the LCD must be initialized
;dont forget to dimension a byte named ___LCDE
[_init_lcd]
.equ Lcdddr = $17 ; Change To Another Address For Ddrd($11)
.equ Lcdport = $18 ; Change To Another Address For Portd($12)
Und so wie es aussieht läuft diese verd... LIB nur auf PortB wenn man nicht
in den Eingeweiden von dem Ding rumwurschtelt.

EDIT: Ich hab mein LCD-Programm mal umgestellt. Das LCD ist jetzt an PortC
und die LEDs an PortA. Und es läuft ohne Probleme. Die LEDs bekommen GND
und Vcc sauber angelegt. Da es Duo-LEDs mit nem roten und grünen Chip
drin sind kann ich beide Pegel fehlerfrei erkennen. Also PortA ist absolut
fehlerfrei. Und das LCD läuft auch an PortC. Aber warum nicht an PortA :stupido3:

@Cassio: kannst du das evtl mal zuhause mit deinem 27x4 Display auf PortA
im 4Bit-Modus testen ? Ich kapier es nicht warum das an dem Port nicht läuft.

Gruß
Dino
 
@Cassio: kannst du das evtl mal zuhause mit deinem 27x4 Display auf PortA
im 4Bit-Modus testen ? Ich kapier es nicht warum das an dem Port nicht läuft.

Hi Dino!

Oh jee... ich habe meine Testboards mit 8x8 Matrix-Anzeigen belegt.
Möchte da einfach mal weiterkommen. :eek:
PICT0971.JPG
(ups.... Datum und Uhrzeit sind falsch!)


Ich muss mal schauen, ob ich nicht noch eines habe, oder irgendeins frei machen kann. :hmmmm:
Allerdings habe ich hier keinen 8535 Controller...
Nur vergleichbare Mega16, Mega32 und Mega644 !
Sollte aber für einen Test reichen.


Gruß,
Cassio
 
Hi Cassio,

Oh jee... ich habe meine Testboards mit 8x8 Matrix-Anzeigen belegt.
Möchte da einfach mal weiterkommen. :eek:
Anhang anzeigen 1808
(ups.... Datum und Uhrzeit sind falsch!)
Auweia sind das Riesenbiester ;)
Ist nicht ganz so schlimm. Wär nur interessant ob bei mir irgendein Fehler
drin steckt oder ob es generell an BASCOM liegt und die da wegen der
möglichen ADC-Eingänge den PortA für die LCDs einfach "vergessen" haben.

Ich muss mal schauen, ob ich nicht noch eines habe, oder irgendeins frei machen kann. :hmmmm:
Allerdings habe ich hier keinen 8535 Controller...
Nur vergleichbare Mega16, Mega32 und Mega644 !
Sollte aber für einen Test reichen.
Mega16 oder Mega32 sind vergleichbar. Sowohl im internen Registeraufbau
als auch mit der Pinbelegung. Der Mega644 ist stark Memory-Mapped mit
den ganzen Registern. Aber sonst auch Pinkompatibel.

Mach dir aber keinen Streß wegen dem LCD ... ;)

Komischerweise sind alle Beispiele die man findet immer mit PortB ...

EDIT: Man kann zwar die IC-Beschriftungen nicht erkennen aber nach
der Pin-Anzahl handelt es sich um 3x ATmega8 ... Richtig ? ;)

Gruß
Dino
 
EDIT: Man kann zwar die IC-Beschriftungen nicht erkennen aber nach
der Pin-Anzahl handelt es sich um 3x ATmega8 ... Richtig ? ;)

Hi Dino!

Richtig getippt! :D

Ich hatte ja mal angefangen diesen MAX7219 nachzuäffen....
Irgendwie sind mir die Matrix-Module mal wieder in die Hände gefallen und ich habe mal drei Stück auf die Testboards gebaut.
So ganz steht die Verdrahtung noch nicht, aber wenigstens habe ich schon mal wieder angefangen. Vielleicht hilft es ja, wenn sie mahnend neben mir liegen. ;)


Mit dem Port.A habe ich spontan auch keine Idee....
Ich lasse den Port aber wegen der ADCs (für Eventualitäten) meistens auch immer frei. ;)

Gruß,
Cassio
 
Hi Dino,

na, Du legst ja gleich mächtig los. Da muss ich Cassio recht geben, Du bist ja programmiertechnisch kein Rookie.:)
Und so wie es aussieht läuft diese verd... LIB nur auf PortB wenn man nicht
in den Eingeweiden von dem Ding rumwurschtelt.
Das ist mir am Anfang auch gleich aufgefallen. Da ich zugegeben bislang noch nicht die LIB's zerpflückt habe, hab ich's halt hingenommen.

Nun, meine Website ist auf aktuellem Stand. Jetzt habe ich wieder Zeit für die AVR's. Ich werde mal versuchen, ein LCD an einem Tiny 24 (14 Pins) zum Laufen zu brinǵen. Wenn das funktioniert, wird das bei mir Standard; dann sind alle Pins an den "großen" frei für Anderes. Und den Versuch mit der digitalen Steuerung muss ich auch noch durchführen; kann ich gleich beides kombinieren.


Grüsse,

Michael.
 
Hi Grandpa,

Das ist mir am Anfang auch gleich aufgefallen. Da ich zugegeben bislang noch nicht die LIB's zerpflückt habe, hab ich's halt hingenommen.
ich hab die LIBs auch nicht zerpflückt. Ich habs nur in nem Forum gelesen das
man das für nen anderen Port in der Lib ändern müßte. Da die Lib bei mir aber
als LBX (nach meiner info bereits kompiliert) vorliegt kann ich da nix dran machen.
Und im Binär-Urschleim rumtippen (Hexcode) hab ich keine Lust. Also mit dem
Fehler leben :p oder mal selber eine schreiben ;)

Was Cassio mir noch in ner PN gesagt hat ... Damit Anfänger nicht bei meiner
Tastenabfrage reinfallen ...

Ich habe die PullUps bei meinen Tasten nicht eingeschaltet. Das hängt aber
mit der Schaltung auf dem Pollin-Nachbauboard zusammen. Und hier die
Erklärung ...

Die Taster hängen beim Pollin-Board nicht vom Pin nach GND sondern nach
Vcc (also +5V). Damit ein definierter Zustand beim geöffneten Taster entsteht
haben die also auf dem Board 33k-Widerstände vom Pin nach GND gelegt.
Also externe PullDown-Widerstände. Wenn ich jetzt die internen PullUps
mit
Code:
PortD=&B1110_0000
aktivieren würde dann hätte ich am Eingangspin einen Spannungsteiler mit
dem externen 33k und dem internen 50k. Dadurch würde sich eine Spannung
von ungefähr 2V am Eingang ergeben. Das ist aber bei der 5V-Logik im
undefinierten Bereich und damit sehr ungünstig für einen definierten Zustand.
Also normalerweise bei Tastern nach GND die PullUps einschalten. In diesem
Fall aber mit den Tastern nach Vcc und externen PullDowns die internen
PullUps AUSGESCHALTET LASSEN.

Gruß
Dino
 
Hallo Dino!

Ich habe mal die Gunst der Stunde genutzt und zwei Tests mit dem 27x4 Display durchgeführt!

Einmal habe ich es so angeschlossen, wie ich es hier schon mal beschrieben habe... mit Port.C für das Display.

Alles funktioniert einwandfrei und damit hatte ich die Gewähr, dass sowohl Software als auch Hardware in Ordnung sind. :)


Danach habe ich die Beschaltung auf Port.A geändert und den BASCOM-Code entsprechend angepasst.


Was dann passierte, kannst du auf den Bilden sehen. ;)
(Die Nummern auf der Anschlussplatine sind FALSCH herum! Nicht irre führen lassen!)
2x4-Port-A_1.jpg

und

2x4-Port-A_2.jpg

Und nun ? ;)


Hier mal der Schaltplan dazu....
27x4-LCD-Display-auf-Port-A.GIF

...und der dazugehörige VOLLSTÄNDIGE BASCOM-Code:


CodeBox Bascom

' 27x4 LCD Testprogramm
' Port A

$regfile = "m16def.dat"
$crystal = 1000000

'$hwstack = 128
'$swstack = 128
'$framesize = 128


' Configuriere das LCD
Config Lcd = 40 * 4
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , E2 = Porta.4 , Rs = Porta.6
Config Lcdbus = 4

Cursor Off

Ddra = &B1111_1111 '1 ist Ausgang 0 ist Eingang
Porta = &B0000_0000 'auf Hi oder Low setzen



' Bestimme die Ein und Ausgänge
Ddrd = &B1111_0000 '1 ist Ausgang 0 ist Eingang
Portd = &B0000_1111 'auf Hi oder Low setzen

Ddrc = &B1111_1111 '1 ist Ausgang 0 ist Eingang
Portc = &B0000_0000 'auf Hi oder Low setzen

Ddrb = &B1_1111 '1 ist Ausgang 0 ist Eingang
Portb = &B0_0000 'auf Hi oder Low setzen



'---------------------------------------------------
Dim ___lcdno As Byte ' LCD-Controller-Schalter


___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls
'---------------------------------------------------


Portd.7 = 1
Waitms 500
Portd.7 = 0
Waitms 500
' ===========================================================
' Arbeitsschleife----------------------------------

Do
Portd.7 = 1

___lcdno = 0
Locate 1 , 1
Lcd "27x4 Segment LCD an Port A"

Locate 2 , 1
Lcd "mit ATMega 16 + int. Quarz!"



___lcdno = 1
Locate 1 , 1
Lcd " Cassio by AVR-Praxis.de"

Locate 2 , 1
Lcd " Samstag d. 16.01.2010"


Wait 5

___lcdno = 0 : Cls
___lcdno = 1 : Cls

___lcdno = 0
Locate 2 , 1
Lcd " Clear "
___lcdno = 1
Locate 1 , 1
Lcd " Screen ! "

Wait 2

Portd.7 = 0
___lcdno = 0 : Cls
___lcdno = 1 : Cls

Wait 1


Loop
' ===========================================================

'------------------------------------------------------------


End




Viel Spaß beim Grübeln! :)

Ich würde also den Fehler eher auf deinem Testboard suchen.....

Gruß,
Cassio :ciao:
 
Hi Cassio,

besten Dank :) Da muß ich wohl mal ein wenig suchen wo da das Problem liegt.
Aber heute nicht mehr ... Erst mal etwas ausspannen. Und morgen werde ich
wohl auch mal was anderes löten was schon nach Fertigstellung schreit ;)

Gruß
Dino
 
Moin Dino!

Hast du das Pollin-Eva-Board denn identisch nachgebaut? :hmmmm:

Um das Display an Port.A zu betreiben, musst du die Jumper 11 + 12 trennen!
Ansonsten verbindest du die Ports A4 und A5 dauerhaft über die Widerstände R9 + R10 mit +5V.
Diese würdest du aber nur benötigen, wenn du mit dem I2C arbeiten möchtest (IC5).

Vielleicht liegt ja darin der Hund begraben?

Gruß,
Cassio
 
Hi Cassio,

Hast du das Pollin-Eva-Board denn identisch nachgebaut? :hmmmm:

Um das Display an Port.A zu betreiben, musst du die Jumper 11 + 12 trennen!
Ansonsten verbindest du die Ports A4 und A5 dauerhaft über die Widerstände R9 + R10 mit +5V.
Diese würdest du aber nur benötigen, wenn du mit dem I2C arbeiten möchtest (IC5).

Vielleicht liegt ja darin der Hund begraben?
Naja ... also die ISP-Schnittstelle ist identisch, es ist ein Sockel für den
Mega8/48/88/168 und einer für Mega16/32/644/8535 drauf. Die Pins von
PortD sind wegen den Tastern/LEDs/RS232 1:1 verbunden. Der I2C hängt
beim 40er Sockel auf PC0+1 (22+23) und am 28er auf PC4+5 (27+28).
Die Jumper zum umschalten des I2C sind aber offen und es steckt kein
EEPROM drin. Die 10k würden aber auch nicht stören. Sonst ist PortC soweit
möglich auch 1:1 verbunden. PortB ist vom 40pol-Sockel 1:1 übernommen.
Vom 28er-Sockel nur bedingt wegen dem ISP. PortA ist direkt ohne
Firlefanz auf den 10poligen Stecker gelegt (alles STK500-Belegung).
Außer Drähte sind also beim PortA der ja sowieso nur am 40pol-Sockel
da ist nix dran. Ich muß da wohl nochmal nen kompletten Schaltplan machen.
Das einzige das ich mir vorstellen kann ist, das der M8535 bei PortA intern
ein Problem hat. Wobei ja die LEDs einwandfrei arbeiten :confused: Alles recht
komisch. Durch die Spielereien mit dem SHIFT und ROTATE konnte ich auch
sehen das es keine Vertauschungen der Leitungen gibt. Es läuft ohne hin
und hergespringe sauber durch. Auch Lötbrücken würde man bei dem
Bitgeschiebe durch unsauberen Durchlauf oder Sprünge bei den LEDs sehen.
Da ich für die Tests Duo-LEDs (antiparallelgeschaltete rote und grüne LED)
verwendet habe kann ich auch auf saubere Durchschaltung von GND und von
Vcc testen. Das einzige was mir noch einfällt ist ein anderer M8535 oder M32
um den µC auszuschließen obwohl er elektrisch einwandfrei zu sein scheint.

Also logisch betrachtet kann es an dem Board und dem µC nicht liegen.

Gruß
Dino
 
Hallo Cassio,

ich hauen weg ! Son Sch... ! :eek: :rolleyes:
Ich hab jetzt dein Programm genommen und lediglich den Takt und die CPU-Def
angepaßt. Einmal an einen Mega8535 und einmal an einen Mega32. Der Mega32
ist frisch jungfräulich aus der Packung. Bei beiden geht PortC mit deinem Code
ohne Probleme sofort und mit PortA geht nix. Keine Reaktion. Die LED blinkt
vor sich hin aber mehr auch nicht. Also am Chip kann es nicht mehr liegen.
Ich hab auch nochmal das Kabel zum LCD getauscht. Nix. Das einzige was
übrig bleibt ist die Verkabelung von PortA (werde ich demnächst komplett
durchtesten) und die Bibliothek oder was auch immer von Bascom da für
dieses LCD eingebunden wird. Also nur noch 2 Möglichkeiten. Ich laß mich mal
überraschen :D Wobei ich die Verkabelung von PortA eigentlich ausschließen
kann. Das hab ich selbst gelötet. Da sind keine Fehler drin :eek: :D ;) :p

P1030746.JPG
da ich gegenüber deiner Verkabelung die E-Leitungen andersrum habe sind
bei mir obere und untere Displayhälfte vertauscht. Aber PortC läuft und
PortA nicht.

Gruß
Dino
 
Hi Dino!

Ist ja schon merkwürdig! :hmmmm:

Also wenn an Port.C alles einwandfrei arbeitet, scheiden Fehler am Anschuss und der Software schon mal aus!

Es kann also nur an Port.A liegen.... bzw. die Verbindung!
Hast du die evtl. "Rückwärts" angechlossen? So dass A.0 nun am Abgang A.7 ist?

Würde einem ggf. beim Shiften der LEDs ja nicht unbedingt auffallen.... ;)


Gruß,
Cassio
 
da ich gegenüber deiner Verkabelung die E-Leitungen andersrum habe sind
bei mir obere und untere Displayhälfte vertauscht.

Hi Dino!

Macht ja nichts....
Entweder Drähte tauschen, oder die "Config Lcdpin" anpassen! ;)

Sieht sonst aber gut aus! :)

Gruß,
Cassio
 

Ü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)