Atmega 128 + Grafik Display ... Bin am verzweifeln...

Strikers

Neues Mitglied
07. Nov. 2010
9
0
0
Sprachen
Hallo! Ich bin ein Neuling in der Elektronik und stehe noch ganz am Anfang. Ich beschäftige mich erst seit wenigen Wochen mit Atmega und versuche nun verzweifelt ein Grafik Display zum laufen zu bekommen, aber ich komme nicht mehr weiter. Auch google hat mir keine große Hilfe geleistet.

Ich habe ein Atmega 128 und ein 12864A RevG Grafikdisplay. Laut google sollte da ein KS108 Chip drin sein, somit habe ich es mal probiert aber ohne Erfolg.

Es wäre toll, wenn Ihr mal meinen Schaltplan und Quellcode anschaut ob ich was falsch mache.


Ich programmiere mit Bascom (ich versuche es jedenfalls) und wenn ich die Zeile config graphlcd mit aufnehme, sieht es so aus als würde der uC nicht mehr laufen, da meine Kontroll LED dauerhaft leuchtet und nicht mehr in der Schleife an/aus geht.

Bei der Pin Belegung bin ich mir nicht so sicher ob das alles so stimmt.
Ich habe auch einen externen 16MhZ Quarz angeschlossen, jedoch scheint es mir als müsse ich diesen noch iergendwie zum leben erwecken.

Code:
'#### Prozessordaten definieren
$regfile = "m128def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 9600


'#### Alias für Port Namen
Led Alias Porte.2


'#### Port definieren (inp/out)
Config Led = Output

'#### include von Daten & Lib's
$lib "glcdks108.lbx"
$include "font8x8.font"

'First we define that we use a graphic LCD

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Cd = 4 , Rd = 3 , Ce = 7 , Ce2 = 6 , Enable = 2 , Reset = 5

'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable

Dim X As Byte , Y As Byte , Z1 As Byte , Z2 As Byte
Setfont Font8x8
'---------------------------------------------------------------------
' Arbeitsschleife

Do
Gosub Lcd_cls2
Wait 1
For Z1 = 1 To 8
Lcdat Z1 , 1 , "--Testschrift!--"
Waitms 500

Next

For Z2 = 0 To 63
Line(0 , Z2) -(127 , Z2) , 1 'make line
Waitms 50
Next

For Z1 = 8 To 1 Step -1
Lcdat Z1 , 1 , "Test invertiert!" , 1 ' will inverse the text
Waitms 500
Next

Wait 2

For Z2 = 63 To 0 Step -1
Line(0 , Z2) -(127 , Z2) , 0 'make line
Waitms 25
Next

For Z2 = 0 To 62 Step 4
Line(0 , Z2) -(127 , Z2) , 1 'make line
Waitms 250
Next

For Z2 = 0 To 124 Step 4
Line(z2 , 0) -(z2 , 63) , 1 'make line
Waitms 250
Next

Wait 2
For Y = 1 To 30
Circle(63 , 31) , Y , 1
Waitms 100
Next
Wait 2

For Y = 30 To 1 Step -1
Circle(63 , 31) , Y , 0
Waitms 100
Next

Wait 2

Gosub Lcd_cls2

Showpic 0 , 0 , Plaatje 'show a comnpressed picture
Wait 5
Loop

End 'end program
'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on Return
'---------------------------------------------------------------------
Plaatje:
'include the picture data
$bgf "ks108.bgf"

Habe nun mein Wochenende ohne Fortschritte vergeuded, bin also für jede Hilfe dankbar!
 

Anhänge

  • atmega128.png
    atmega128.png
    40,2 KB · Aufrufe: 34
Moin ? (Name fänd ich nett)

Bei PortC denke ich immer als erstes an die Fuse-Bits.
JTAG fiele mir dazu ein.

Außerdem gibt es da ja noch die Mega103-Kompatibilität.
Ich meine mich zu erinnern, dass der Betrieb des PortC nur als Ausgang möglich ist , wenn die Mega103-Kompatibilität geschaltet ist. Und die ist im
Auslieferungszustand geschaltet.

Schönen Gruss
Markus
 
Hi Markus, mein Name (auch) Markus...

Ich kann auch das LCD mal auf einen anderen Port legen, sollte dann vielleicht besser sein. Habe das mit den FuseBits schonmal gelesen das da was an PortC ist, aber wußte nicht sorecht was das bedeutet.

Werd heute Abend mal umlöten und mich dann wieder melden.

Vom Quelltext und den Port Zuweisungen wäre es aber korrekt!?

Danke & Gruß
 
Hi Markus,

Habe das mit den FuseBits schonmal gelesen das da was an PortC ist, aber wußte nicht sorecht was das bedeutet.
dann empfehle ich dir erst mal die FAQs hier im Forum. Da habe ich die ganzen
Fuses mal erklärt und was das damit auf sich hat.

Als erstes würde ich bei deinem Mega128 erstmal den M103-Modus abschalten
und das JTAG-Interface deaktivieren. Dann sieht das alles schon sehr viel
geschmeidiger aus. Danach kannst du die Hardware immer noch umlöten.
Dann hast du nämlich auch auf einmal 2 UARTs ;)

Hier nochmal die Daten des Displays ...
TG12864_128x64GLCD.png
Grünes, grafisches LC-Display (128x64 Pixel) mit integriertem Controller (kompatibel zu KS0108) und LED-Hintergrundbeleuchtung. Geeignet zum Betrieb am PC-Druckerport (LPT). Download verfügbar.
Technische Daten:
- Auflösung 128x64 Pixel
- gelbe LED-Hintergrundbeleuchtung
- Betriebsspannung +5 V-
- Kontrastspannung +9 V-
- Pixelgröße 0,48x0,48 mm
- Anzeigefläche 72x40 mm
Maße (BxHxT): 93x70x13 mm.
Das steht zumindest bei Pollin beim Displays drin.
Sieh mal hier bei Cassio seinem Beitrag ...
LCDs und GLCDs anschließen und ansteuern (BASCOM) - Beitrag #2
Da ist genau das Display drin. Komischerweise aber auch mit +5V für den
Kontrast :confused: Naja ... evtl nen Fehler bei Pollin im OnlineShop.
Auf jeden Fall kannst du das Beispiel recyclen.

Gruß
Dino
 
Hallo und danke für die Antwort. Bin fleißig am FAQ lesen.

ich habe nun mit PonyProg (dem einzigen Programm was läuft) die Fusebits ausgelesen und diese sehen wie folgt aus:

fusenexyk.png


Kann ich nun ohne etwas zu beschädigen die Haken bei "M103C" und "JTAGEN" rausmachen und dann write drücken?

Ich habe auch einen externen Quarz angeschlossen, aber ich denke nicht "eingeschaltet". Du hattest ja dies geschrieben:

CKSEL0..3 (Clock Select)
Mit diesen Bits stellt man den Arbeitsmodus des Oszillators ein. Also womit
er den Takt erzeugt und wo er den Takt herhohlt. Dabei gelten folgende
Begriffe ...

* External Ceramic Resonator - Ein extern angeschlossener Keramikresonator
günstig aber nicht sehr frequenz- und temperaturstabil
* External Crystal Resonator - Ein extern angeschlossener Quarz
etwas teurer aber dafür relativ frequenz- und temperaturstabil
* Calibrated Internal RC Oscillator - man benötigt keine externe Beschaltung.
Die Frequenz läßt sich ein wenig kalibrieren. Stabilität? Naja. Schwingt
* External RC Oscillator - Einfach ein Widerstand und ein Kondensator an
den Oszillatorpins. Stabilität? Egal! Es schwingt
* External Clock - Eine externe Taktquelle (Quarzoszillator, anderes IC, ...)

Muss ich dann den Haken bei "CKSEL0" setzen und bei "CKSEL3" entfernen, damit die externen 16MhZ funktionieren?

Danke!!!
 
Hi,

Bin fleißig am FAQ lesen.
das ist gut ;)

ich habe nun mit PonyProg (dem einzigen Programm was läuft) die Fusebits ausgelesen und diese sehen wie folgt aus:

fusenexyk.png

Kann ich nun ohne etwas zu beschädigen die Haken bei "M103C" und "JTAGEN" rausmachen und dann write drücken?
Ja. Die Fuse "M103C" würde ich auf jeden Fall rausnehmen. Wenn du die
"JTAGEN" rausnimmst dann kannst du denn Atmel allerdings nur noch mit
ISP (also zB AVRISPmk2, STK200 (LPT), ...) programmieren.

Ich habe auch einen externen Quarz angeschlossen, aber ich denke nicht "eingeschaltet". Du hattest ja dies geschrieben:

Muss ich dann den Haken bei "CKSEL0" setzen und bei "CKSEL3" entfernen, damit die externen 16MhZ funktionieren?
Ich hab bei mir einen 14,7456MHz Quarz dran.
Meine Fuses sind folgendermaßen (bei PonyProg) ...

[ ]7 [ ]6 [ ]BootLock12 [ ]BootLock11 [ ]BootLock02 [ ]BootLock01 [ ]Lock2 [ ]Lock1
[ ]7 [ ]6 [ ]5 [ ]4 [ ]3 [ ]2 [ ]M103C [ ]WDTON
[ ]OCDEN [ ]JTAGEN (X)SPIEN [ ]CKOPT [ ]EESAVE [X]BOOTSZ1 [X]BOOTSZ0 [ ]BOOTRST
[ ]BODLEVEL [X]BODEN [ ]SUT1 [ ]SUT0 [ ]CKSEL3 [ ]CKSEL2 [ ]CKSEL1 [ ]CKSEL0

Es sind also nur SPIEN (kann man mit Pony sowieso nicht ändern), BOOTSZ1,
BOOTSZ0 und BODEN mit nem Haken drin.

Damit läuft der Mega128 vollwertig mit einem externen Quarz mit 16MHz und
du kannst mit PonyProg, BASCOM, AVR-Studio, ... mit nem LPT-Progger,
COM-Progger, AVRISPmk2, MyAVR...WasWeissIch drauf zugreifen.
Viel Spaß ;)

Gruß
Dino
 
Hallo Markus,

du stellst folgende Fusebits folgendermaßen ein, wenn du einen Quarz mit 16MHz verwendest:

Atmega128

Quarz 16MHz angeschlossen an XTAL1/2
Crystal Oscillator, slow rising power
16K CK Startup Time from Power-down, Power-Save
65ms Delay from Reset

CKSEL3..1 = 111
CKOPT = 0
CKSEL0 = 1
SUT1..0 = 11


"0" = programmiert
"1" = nicht programmiert


JTAG

Wenn du nicht mehr über JTAG programmieren oder debuggen möchtest oder musst, dann kannst du natürlich das Fusebit JTAGEN abschalten:

JTAGEN = 1

Dann kannst du PORTF4..7 als IO verwenden.

Den Mega102 Kompatibilitätsmodus solltest du dann auch abschalten:

M103C = 1

Ist der Kompatibilitätsmodus noch aktiviert (Lieferzustand) dann gilt folgendes:

By programming the M103C fuse, the ATmega128 will be compatible with the ATmega103
regards to RAM, I/O pins and interrupt vectors as described above. However, some new fea-
tures in ATmega128 are not available in this compatibility mode, these features are listed below:
• One USART instead of two, Asynchronous mode only. Only the eight least significant bits of
the Baud Rate Register is available.
• One 16 bits Timer/Counter with two compare registers instead of two 16-bit Timer/Counters
with three compare registers.
• Two-wire serial interface is not supported.
• Port C is output only.
• Port G serves alternate functions only (not a general I/O port).
• Port F serves as digital input only in addition to analog input to the ADC.
• Boot Loader capabilities is not supported.
• It is not possible to adjust the frequency of the internal calibrated RC Oscillator.
• The External Memory Interface can not release any Address pins for general I/O, neither
configure different wait-states to different External Memory Address sections.
In addition, there are some other minor differences to make it more compatible to ATmega103:
• Only EXTRF and PORF exists in MCUCSR.
• Timed sequence not required for Watchdog Time-out change.
• External Interrupt pins 3 - 0 serve as level interrupt only.
• USART has no FIFO buffer, so data overrun comes earlier.
Unused I/O bits in ATmega103 should be written to 0 to ensure same operation in ATmega128.
Diese Angaben sind wie immer ohne Gewähr ;)

Grüße,
Dirk

EDIT: Na da war ja Dino wieder mal 2 Minuten schneller :D
 
Hi! Danke für die ausführlichen Antworten.

Mit dem Grafik LCD hat es noch nicht geklappt, jedoch habe ich mir zum testen mal ein 16x4 LCD gekauft das etwas einfacher für den Anfang ist.

Dort wurde mir nur Zeile 1+3 als Kästchen angezeigt, nachdem ich dann die Fusebits gesetzt hatte wie Ihr beschrieben habt, konnte ich meinen Text sehen :D Nur iergendwie (ich lasse Zahlen hochzählen) rennt der wie verrückt seit der Umstellung. Muss ich da noch was ändern im "header" der code datei bezüglich der externen Clock?

Code:
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space
$crystal = 1600000
$baud = 9600

fuse1d1aw2.png
 
Hi,

Nur iergendwie (ich lasse Zahlen hochzählen) rennt der wie verrückt seit der Umstellung. Muss ich da noch was ändern im "header" der code datei bezüglich der externen Clock?
wenn du natürlich in der Hauptschleife bei jedem Durchlauf ne Variable
hochzählen läßt dann geht das mit 16MHz natürlich schneller als vorher ;)
Du hast doch hoffentlich das Programm neu kompiliert und dann übertragen ?
Vor allem neu kompiliert. Sonst läuft die Kiste jetzt mit 16MHz mit dem
8MHz-Proggi. :D

Gruß
Dino
 
Ja das habe ich, läuft echt verdammt schnell ;-)

Vorher lief es eher im sekundentakt hoch und nun siehts aus als wäre jede 10Sekunden nur 1 Sekunde... werde jetzt mal etwas lesen wie ich da mehr oder weniger sekunden draus bekomme und meinen Temperatursensor angeschlossen bekomme. Werde mich dann bei Erfolg oder Misserfolg später nochmal melden.

Gruß Markus
 
hmm brauche doch nochmal hilfe, habe schon einiges gelesen aber es gibt ja soviele Arten von Sensoren. Ich habe aber 3 verschiedene Sensoren da, nur welche ist der einfachste zum anschließen?

TEMP.-SENSOR TS103F3950C4 -30 - +105°C (Datenblatt
LM335 TO92
KTY-81-110

Der 1. wäre mir am liebsten, da dieser glaube ich so ein "1 wire" Sensor ist und der dann in Bascom mit vorhandenen Befehlen wie Config 1wire = Portxxx bedient werden kann. Ob dieser analog oder digital ist konnte ich aus dem Datenblatt nicht erkennen. Bei Analog muss er wohl an einen ADC Port des Atmels.

Wenn der 1. nicht geht, hätte ich den LM335 jetzt so angeschlossen:
lm335wt1mv.png


Gruß
 
TEMP.-SENSOR TS103F3950C4 -30 - +105°C (Datenblatt
LM335 TO92
KTY-81-110

Der 1. wäre mir am liebsten, da dieser glaube ich so ein "1 wire" Sensor ist
Leider nein. Im Datenblatt steht bei der Zeichnung unter No.1 => NTC
Also ein temperaturabhängiger Widerstand der mit zunehmender Temperatur
kleiner wird.

und der dann in Bascom mit vorhandenen Befehlen wie Config 1wire = Portxxx bedient werden kann. Ob dieser analog oder digital ist konnte ich aus dem Datenblatt nicht erkennen. Bei Analog muss er wohl an einen ADC Port des Atmels.
Ein NTC ist immer analog.
Ein 1Wire-Sensor ist immer digital.
Das hat beides (bis auf die Messung der Temperatur) nix miteinander zu tun.
Also aufpassen und nichts miteinander verwechseln.

Wenn der 1. nicht geht, hätte ich den LM335 jetzt so angeschlossen:
lm335wt1mv.png
theoretisch ja. Aber der Widerstand wird nicht passen.
Der LM335 hat laut Datenblatt bei 25°C ca 3V anliegen und benötigt
mindestens 450µA bis maximal 5mA für den Betrieb. Das macht dann ...
(5V-3V)/2mA = 1kOhm (ich hab sicherheitshalber 2mA genommen).
Also brauchst du 1kOhm und keine 4,7kOhm.
Das Datenblatt ... Anhang anzeigen LM335_NationalSemiconductor.pdf
bei 10mV/K kommt man dann bei 100°C auf ...
(100°C-25°C)*.01V+3V = 3,75V
Damit liegst du also bei 100°C mit dem 1k Widerstand bei 1,25mA durch den
LM335. Damit sollte er noch gut arbeiten.

Gruuß
Dino
 
Supi, es scheint schon mal funktioniert zu haben, mal ein Erfolg zu sehen ist echt toll :)

Ich habe den LM335 mit 990Ohm angeschlossen da ich keinen 1k mehr hatte sondern nur 3*330.

lm3351ep9ch.png


Auf meinem Display erscheint nun:
Zeile1: 600
Zeile2: 2,93 Volt
Zeile3: 17,97 Grad

Habe ich dies richtig gerechnet?

Code:
Dim Lm As Word
Dim Volt As Single
Dim Temp As Single

   Lm = Getadc(0)                   ' ADC Port auslesen

   Volt = Lm * 5                      ' 5 ist die Spannung des uControllers
   Volt = Volt / 1024                ' Umrechnung des ADV Ports in Volt

   Temp = Volt - 3.75               ' Volt Umrechnung in Temperatur
   Temp = Temp / 0.01
   Temp = Temp + 100

      Wait 3
      Led = 1
      Wait 3
      Led = 0
      Wait 3

   Locate 1 , 1
   Lcd Lm

   Locate 2 , 1
   Lcd Fusing(volt , "#.##") ; " Volt"

   Locate 3 , 1
   Lcd Fusing(temp , "#.##") ; " Grad"

   Wait 1
 
Hi,

Auf meinem Display erscheint nun:
Zeile1: 600
Zeile2: 2,93 Volt
Zeile3: 17,97 Grad

Habe ich dies richtig gerechnet?
Die Rechnung hab ich mir jetzt nicht angesehen. Nur soviel ...
Der LM335 ist ein analoger Sensor. Also mußt du ihn kallibrieren. Im Datenblatt
steht folgendes ...
Operating output voltage (Tcase = +25°C, IR = 1mA) min 2.92V, typ 2.98V, max 3.04V
Die Spannung am Sensor kann also bei 1mA Strom zwischen 2,92 und 3,04V
variieren. Das sind bei 10mV/K ...
(3,04-2,92)/0,01 = 12°C
Also könnte dein gemessenes Ergebnis um bis zu 12°C vom tatsächlichen Wert
abweichen. Nimm mal ein Referenztermometer bei dem du sicher bist das der
angezeigte Wert stimmt und dann vergleich das mal.

Gruß
Dino
 
Hi, mein Sensor hat eine Abweichung von zur Zeit ca. 7 Grad :(

Ich habe gelesen das man mit einem Poti den Wert kalibrieren soll und ggf. Eiswasser als Referenz (0°C) zu nehmen.

Zur Kalibrierung schließt man an ein 10kOhm Potentiometer zwischen V+ und V- (GND) des Sensors an und legt dessen Schleifer auf den ADJ-Pin. Nun stellt man die Ausgangsspannung in Abhängigkeit von der Raumtemperatur (welche bekannt sein sollte) ein (1oC = 1K, 273K = 0oC). Kalibriert man den LM335 nicht, so kann dieser um bis zu 9K falsch gehen!
 
Hallo,

Ich habe gelesen das man mit einem Poti den Wert kalibrieren soll und ggf. Eiswasser als Referenz (0°C) zu nehmen.
Zur Kalibrierung schließt man an ein 10kOhm Potentiometer zwischen V+ und V- (GND) des Sensors an und legt dessen Schleifer auf den ADJ-Pin....
aber nimm einen Spindeltrimmer (Cermet-Trimmer) dafür und kein normales
Trimmpoti. Die Cermet-Widerstandsbahnen haben einen kleinere Abweichung
bei Temperaturänderungen als normale Kohleschicht-Trimmer.

Oder du kallibrierst über Software. Einfach den Fehler mit einrechnen.
Das spart externe Bauteile.

Gruß
Dino
 
Hallo! Habe das mit der Temperatur nun mehr oder weniger kalibriert bekommen.
Nun kann ich schonmal mein Relais nach Temperaturabhängigkeit schalten :)

Ich brauche nun aber noch ein weiteren Temp. Sensor. Diesen brauche ich aber um eine Flüssigkeit zu messen die ca. 120-130 Grad hat. Ich habe nach 1 Wire Hülsenfühler gesucht, damit ich diese nicht mehr kalibrieren muss und dann auch in Flüssigkeit tauchen kann.

Der DS18B20 scheint ja ein sehr beliebtes Modell zu sein. Nur das Limit liegt bei 125 Grad. Könnte sein das es reicht oder auch nicht, wäre auf jedenfall grenzwertig.


Gibt es vielleicht noch andere empfehlenswerte Hülsen-Sensoren die preislich noch interessanter sind und eine höhere Temperatur aushalten?


Grüße Markus
 
Hi Markus,

Ich brauche nun aber noch ein weiteren Temp. Sensor. Diesen brauche ich aber um eine Flüssigkeit zu messen die ca. 120-130 Grad hat. Ich habe nach 1 Wire Hülsenfühler gesucht, damit ich diese nicht mehr kalibrieren muss und dann auch in Flüssigkeit tauchen kann.
schau mal bei Pollin. Da gibt es PT1000 (tausend!!!) Fühler mit VA-Mantel und
Silikonleitung für 9,95eur. Ich hab mir da mal 4Stk von besorgt. Die sehen ganz
vernünftig aus. Kallibrieren mußt du die aber auch. Ist ja schließlich auch analog :D
Der Preis ist für das Ding absolut OK.

Gruß
Dino
 

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