mikrocontroller.net

Forum: Compiler & IDEs Zwei Pins von PORTB frei geben und dafür zwei Pins von PORTD bekommen?


Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich stecke etwas in Schwierigkeiten ;-)
Ich habe ein LCD welche schon in eine Schaltung eigendlich Funktioniert.
Jetzt will ich einen Quarz zusätlich anlöten(weil ich genaue Zeit 
brauche), allerdings sitzt dieser LCD mit den 8 Pins am gesammten PORTB.
Somit sind die Pins des ATmega8 für den Quarz schon belegt ;-(
Ich möchte eigendlich nur per Software die Oberen zwei Pins 
(PINB7,PINB6)
frei bekommen und den PORTD (PIND1,DIND0) zuweisen.

also:
LCD_DDR = DDRB0, DDRB1, DDRB2, DDRB3, DDRB4, DDRB5, DDRD0, DDRD1

LCD_PORT = PORTB0, PORTB1, PORTB2, PORTB3, PORTB4, PORTB5, PORTD0, 
PORTD1

LCD_PIN = PINB0, PINB1, PINB2, PINB3, PINB4, PINB5, PIND0, PIND1

Ich hoffe dass ist anschaulich erklärt...

Wie kann man denn so was C-technisch programmieren?

Könnt ihr mich da bitte etwas unterstützen?

Herzlichen dank
Khan

Ach ja alle anderen Ports sind auch belegt...

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlen die Angaben zum LCD und den Steuerleitungen.

Die Kristallkugel sagt: Wo 8-Bit-Bus geht sollte auch
                        4-Bit-Bus gehen.

Also schau mal in dein Datenblatt.

avr

Autor: Khan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
;-) Kristalkugel :-)

LCD ist schon in 4-Bit Modus betrieben.

An den beiden genannten Pins sind OC1 und OC0 angeschlossen...

Ich habe es deshalb nicht den LCD-Daten angegeben weil dies mehr ATmega8 
betrifft.

grüße
Khan

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Problem, die LCD-Pins kannst Du definieren, wie Du willst:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,
habe mir gerade den Code von Peter Dannegger angesehen,
und ich verstehe  folgender Precompiler Teil nicht
#ifndef _lcd_drv_h_
#define _lcd_drv_h_
könnte mir das Jemand Bitte erklären ?

Vielen Dank für Eure Hilfe

Gruß
Peter

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank,

richtig so kann ich es machen, allerdings gibt es noch eine Möglichkeit
dass ich nur mit einer Varieble x die 5pins von PORTB und die 2Pins von 
PORTD ansteuern kann....

Denn dadurch muss ich nicht soviel Kode ändern....

Grüße und Dank
Khan

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pier S. schrieb:

>
> #ifndef _lcd_drv_h_
> #define _lcd_drv_h_
> 
> könnte mir das Jemand Bitte erklären ?

So etwas nennt man einen 'Include Guard' also einen "Einschluss Wächter"

Er verhindert, dass ein und dasselbe include File in einer Compilation 
Unit (gemeinhin ein einzelnes *.c File) mehrfach includiert wird.
D.h. er wird schon mehrfach includiert, aber der Compiler sieht den 
Inhalt nur ein einziges mal.

Natürlich wird jetzt niemand hergehen und schreiben
#include "a.h"
#include "a.h"
#include "a.h"
#include "a.h"
#include "b.h"

das wäre unsinnig. Aber trotzdem kann es auf Umwegen schon einmal 
vorkommen, dass ein Include File mehrfach indirekt includiert wird
zb.

File basis.h
************
// Basis.h
// Datei enthält irgendwelche Basisdefinitionen die
// überall gebraucht werden
//

File uart.h
***********
#include "basis.h"
// uart spezifische Dinge, die aber auch
// ein paar Dinge aus basis.h benötigen
//

File lcd.h
**********
#include "basis.h"
// lcd spezifische Dinge, die aber auch
// ein paar Dinge aus basis.h benötigen
//


Und dann gibt es natürlich noch das main.c, welches zb eine uart und ein 
lcd gemeinsam einsetzen möchte

File main.c
***********
#include "uart.h"
#include "lcd.h"

.....

Nachdem sich der Präprozessor die main.c vorgenommen und alle #include 
aufgelöst hat, geht dieser Quelltext zum eigentlichen C-Compiler
// Basis.h
// Datei enthält irgendwelche Basisdefinitionen die
// überall gebraucht werden
//
// uart spezifische Dinge, die aber auch
// ein paar Dinge aus basis.h benötigen
//
// Basis.h
// Datei enthält irgendwelche Basisdefinitionen die
// überall gebraucht werden
//
// lcd spezifische Dinge, die aber auch
// ein paar Dinge aus basis.h benötigen
//

.....

Und wie man sieht, ist der Inhalt von basis.h jetzt zweimal in dieser 
Zwischenstufe vorhanden.

Der include Guard verhindert das.
#ifndef BASIS_H
#define BASIS_H
// Basis.h
// Datei enthält irgendwelche Basisdefinitionen die
// überall gebraucht werden
#endif

Wenn der Präprozessor die build.h das erste mal hereinzieht, dann 
existiert das Makro BASIS_H nicht, alles was nach dem #ifndef kommt wird 
also in den entstehenden Quelltext mit übernommen. Aber genau dadurch 
wird in Folge das Makro BASIS_H definiert. Wird das zweite mal versucht 
basis.h zu includieren, existiert das Makro dann schon, und alles 
zwischen dem #ifndef und dem zugehörigen #endif wird vom Präprozessor 
nicht in den entstehenden Quelltext übernommen. Fazit: Der Inhalt von 
basis.h wird nur einmal vom Prärpozessor in die Zwischenstufe eingebaut 
die dann zum Compiler geht.

Und das war der ganze Sinn der Übung.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Khan schrieb:
> Vielen dank,
>
> richtig so kann ich es machen, allerdings gibt es noch eine Möglichkeit
> dass ich nur mit einer Varieble x die 5pins von PORTB und die 2Pins von
> PORTD ansteuern kann....
>
> Denn dadurch muss ich nicht soviel Kode ändern....

Wenn dein Code so unflexibel ist, dass er sich nicht darauf anpassen 
lässt, zumindest die LCD Steuerleitungen frei auf Port Pinzuordnung 
anzupassen, dann ist es sowieso besser, du überarbeitest ihn.
Die 4 Datenleitungen kann man beieinander lassen, das artet tatsächlich 
in eine Codeschlacht aus, aber die Steuerleitungen so in den Code 
einzuweben, dass man sie mit ein paar #define einfach auf beliebige Port 
Pins verteilen kann, ist eine simple Übung.

Fang damit an, dass du dir für die 4 Steuerleitungen gleichwertige Port 
Definitionen #define erzeugst, wie hier
#define LCD_DATA_DDR     DDRB
#define LCD_DATA_PORT    PORTB
#deinfe LCD_DATA_PIN     PINB

#define LCD_EX_DDR       DDRB
#define LCD_EX_PORT      PORTB
#define LCD_EX_PIN       PINB

#define LCD_RW_DDR       DDRB
#define LCD_RW_PORT      PORTB
#define LCD_RW_PIN       PINB

#define LCD_OC1_DDR      DDRB
#define LCD_OC1_PORT     PORTB
#define LCD_OC1_PIN      PINB

#define LCD_OC2_DDR      DDRB
#define LCD_OC2_PORT     PORTB
#define LCD_OC2_PIN      PINB

Und dann gehst du deinen Code durch und ersetzt dein bisher einziges 
LCD_DDR, LCD_PORT, PCD_PIN durch die jeweils benötigten neuen #define
Wenn der Rest halbwegs sauber geschrieben ist, sollte das dann schon 
fast die komplette Änderung sein.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,
für die ausführliche Erklärung!
Gruß
Peter

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl heinz Buchegger,

ich glaub du hast Recht!
Ich sollte mich einmal hinsetzten und diesen Kode einfür allemal 
flexibel gestalten...Beim nächsten einsatz habe ich wieder dass gleiche 
Problem wahrscheinlich....

Grüße
Khan

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Die 4 Datenleitungen kann man beieinander lassen, das artet tatsächlich
> in eine Codeschlacht aus

Na na, übertreib mal nicht so.
Das sind nur 4 * CBI, SBRC, SBI, also 12 Befehle.
Das merkst Du garnicht, aber gewinnst die absolute Flexibilität.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Karl heinz Buchegger schrieb:
>> Die 4 Datenleitungen kann man beieinander lassen, das artet tatsächlich
>> in eine Codeschlacht aus
>
> Na na, übertreib mal nicht so.

Du hast recht. Ich hätte es anders formulieren sollen.
Wo ich ihn hinbringen wollte: In einem ersten Schritt ist es sicherlich 
ausreichend, wenn er sich die Steuerleitungen frei konfigurierbar macht. 
Das ist eine Sache auf ein paar Minuten und wird in vielen Fällen 
ausreichen, da ja deren Ansteuerung sowieso schon auf Einzelbitebene 
realsiert ist. D.h. am vorhandenen Code ändert sich funktional so gut 
wie nichts, ein paar #define kommen dazu und werden im vorhandenen Code 
verwendet. Und das wars dann schon.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.