- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 15

Thema: Anfänger Quellcode

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied Avatar von Matthias 321
    Registriert seit
    09.09.2009
    Ort
    nahe Nürnberg
    Beiträge
    35
    Ok, ich hab genau deinen Code übernommen (außer dass ich keine SelectIn Leitung hab) und folgendes passiert: Der Drucker meldet Error, vermutlich weil die Tinte leer ist, das zeigt er auch an. Strobe ist auf high, passt. Autofeed ist an, passt auch. Allerdings wird der Chip warm (bin ich nicht gewöhnt, kann aber daran liegen, dass er sich in einer Schleife aufhängt, die recht rechenintensiv ist) und, was noch schlimmer ist, der Drucker meldet ständig "Busy", sobald ich ihn anschließ. Und er initialisiert sich, ist auch nicht geplant. Einen richtigen Rest bekomm ich aber nicht hin, da der Chip über den Drucker mit Strom versorgt wird, am Strobe liegt ja eine gewisse Spannung an, mit der der Drucker low erkennt. Aber an sich macht der Drucker nichts, ACK ist auch immer high, selbst wenn der Drucker nicht mit dem Board verbunden ist.

    MfG
    Matthias

    PS: Ich warte mit dieser Schleife auf einen Tastendruck, ist die so richtig? PINK ist lustigerweise rot im Editor ^^ while(!(PINK & (1<<PINK0))); //Wartet auf einen Tastendruck"
    Vergesslichkeit ist doch recht nützlich: Man spart viel Zeit

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Bin ja kurz davor 'nen alten Drucker zu reanimieren. ;)

    Hier nun eine verbesserte Variante:

    Code:
    // Druckeransteuerung mit AVR über Centronics-Schnittstelle                     mic 7.4.2012
    
    // https://www.roboternetz.de/community/threads/57421-Anf%C3%A4nger-Quellcode
    
    // PORTE ist D0-D7
    // PORTF sind die Steuersignale:
    
    // PF0: nc       Out Low = Drucker ausgewählt
    // PF1: nc       Out
    // PF2: Strobe   Out fallende Flanke = Datenübernahme
    // PF3: Busy     In  Low = nicht beschäftigt
    // PF4: ACK      In  Low = Übernahmebestätigung
    // PF5: INIT     Out Low = Drucker initialisieren
    // PF6: ERROR    In  Low = Fehler aufgetreten
    // PF7: Autofeed Out Low = Linefeed bei CR
    
    // http://www.hardwareecke.de/berichte/schnittstellen/centronics.php
    // http://de.wikipedia.org/wiki/IEEE_1284
    
    #define strobe (1<<PF2)
    #define busy (1<<PF3)
    #define ack (1<<PF4)
    #define init (1<<PF5)
    #define error (1<<PF6)
    #define autofeed (1<<PF7)
    
    #define     F_CPU 16000000  // Taktfrequenz des myAVR-Boards
    #include    <avr\io.h>      // AVR Register und Konstantendefinitionen
    #include    <util/delay.h>
    
    int main(void)
    {
    	unsigned char i, t;
    	unsigned char text[14] = "Hello World!\n\r"; //Text string + LFCR
    
    	DDRE = 0b11111111; // Datenleitungen DATA0-7
    
    	DDRF = strobe | init | autofeed; // Steuerleitungen zum Drucker (Ausgänge)
    	PORTF = strobe | init | autofeed; // Kein strobe, kein init und kein autofeed
    	PORTF = busy | ack | error; // PullUps für die Eingangssignale aktivieren
    
    	t=PINK; // Tastenstatus einlesen
    	while(PINK == t); // Hat sich was geändert?
    
    	for (i = 0; i<14; i++) //Liest alle Stellen des String (Index 0 bis 13!)
    	{
    		while(PINF & busy); // Warten wenn Drucker beschäftigt (busy=high)
    		PORTE = text[i]; // Legt die Zeichen an den Datenausgang
    
    		PORTF &= ~strobe; // Setzt Stobe auf low = Drucker Daten übernehmen
    		_delay_ms(1);
    		PORTF |= strobe; // Setzt Strobe wieder auf high
    		_delay_ms(1);
    	}
    
    	while(1); // Programm darf nie beendet werden!
    	return(0);
    }
    (ebenfalls ungetestet)

    Ich vermute, der Drucker wurde dauernd im Init gehalten. Diese Version setzt nun auch das Init-Bit.

    Nach dem Reset ist Port K sowieso Eingang, deshalb braucht man keine zusätzliche Initialisierung. Allerdings weiß ich immer noch nicht, wie die Taster angeschlossen sind. Schalten sie gegen Vcc oder gegen GND? Externe PullUps/PullDowns?

    Der String endet mit LFCR, deshalb kann man das Autofeed beim Drucker deaktivieren. Wenn's mal klappt kannst du das ja ändern...

    Die PullUps an den Eingängen sind eher ein Versuch, scheint mir vernünftig. Port K wird bei mir (KamAVR) akzeptiert.

    Gruß

    mic

    P.S.: Der Mega2560 hat tatsächlich einen Port K: http://www.atmel.com/Images/doc2549.pdf
    (Über 'nen Mega32u4 bin ich noch nicht hinausgekommen...)
    Geändert von radbruch (07.04.2012 um 18:39 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied Avatar von Matthias 321
    Registriert seit
    09.09.2009
    Ort
    nahe Nürnberg
    Beiträge
    35
    Ahhh, ich ich glaub ich habs! "34: error: initializer-string for array of chars is too long" Dieser Fehler hat mich stutzig gemacht, ich dachte du hättest einen Fehler gemacht, da du das in einer 14 "langen" Stringvariable speichern willst, obwohl es ja 16 Lettern sind. \n und \r werden von meinem Compiler/Interpreter oder was auch immer dafür zuständig ist nicht als eigenständiges ASCII Zeichen bzw. Befehl erkannt! In der ersten Version hab ich's einfach "verbessert". Robotik Visionäre soll man nicht anzweifeln...

    Und vielen Dank wegen dem "#define strobe (1<<PF2)", sowas hab ich gebraucht, ist einfach übersichtlicher.

    EDIT: Ganz vergessen: Die Taster sind aktiv high, zumindest schließe ich das aus diesem Datenblatt.
    Vergesslichkeit ist doch recht nützlich: Man spart viel Zeit

  4. #4
    Benutzer Stammmitglied Avatar von Matthias 321
    Registriert seit
    09.09.2009
    Ort
    nahe Nürnberg
    Beiträge
    35
    Gut, ich habe deinen neuen Code aufgespielt (ohne LFCR Anweisung) und ausgeführt. Der Drucker druckt! Zuminsdest tut er so, der Druckkopf ist stark eingetrocknet, hab ihn grad einer Alkohol-Spezialwäsche unterzogen, mal sehen, ob er nach der Einwirkzeit wieder frei ist.

    Ich danke euch für die Unterstützung! Lasst bitte den Thread noch abonniert, ich hab bestimmt noch ein paar Fragen in der nächsten Zeit und ihr seid echt fit auf dem Gebiet...
    Vergesslichkeit ist doch recht nützlich: Man spart viel Zeit

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Matthias 321 Beitrag anzeigen
    \n und \r werden von meinem Compiler/Interpreter oder was auch immer dafür zuständig ist nicht als eigenständiges ASCII Zeichen bzw. Befehl erkannt!
    Jede Wette, dass dem nicht so ist.
    14 ist nur einfach zu wenig für "Hello World!\n\r". Die benötigte Array-Größe hierfür ist 15 (14 Zeichen + Null-Terminierung).
    MfG
    Stefan

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    "Robotik Visionäre soll man nicht anzweifeln" ist natürlich Unsinn. Welchen Compiler verwendest du denn? Ich vermute, der Preprozessor interpretiert die Steuerzeichen im String ...

    @sternst:
    Das Array "unsigned chartext[14]" besteht erstmal nur aus 14 Elementen vom Typ "unsigned char". Ein String mit Endekennung wird es wohl erst so:
    unsigned char text[] = "Hello World!\n\r";

    (Ich hoffe sehr, dass dies so stimmt. Robotik Visionäre sind in meinem Falle C-Einsteiger)

    Gruß

    mic
    Geändert von radbruch (07.04.2012 um 19:11 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Benutzer Stammmitglied Avatar von Matthias 321
    Registriert seit
    09.09.2009
    Ort
    nahe Nürnberg
    Beiträge
    35
    Hi,
    "unsignedchar text[15] = "Hello World!\n\r";" funktioniert jedenfalls (d.h. ich bekomme keinen Fehler beim compilieren, ausprobieren geht ja noch nicht). Und nur so aus Interesse, wie bekomm ich denn ein Backslash in einen String? Per doppeltem Backslash (\\)?
    Vergesslichkeit ist doch recht nützlich: Man spart viel Zeit

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von radbruch Beitrag anzeigen
    Das Array "unsigned chartext[14]" besteht erstmal nur aus 14 Elementen vom Typ "unsigned char".
    Ja eben, und "Hello World!\n\r" ist ein String mit Endekennung, der eben in dieses 14-Elemente-Array nicht komplett hineinpasst. Daher die Warnung (*).

    (*) der OP verwendet vermutlich -Werror, daher bei ihm ein Fehler.
    MfG
    Stefan

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    unsigned char text[14] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\n', '\r'}; // Text string + LFCR

    ...sind 14 Elemente.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Benutzer Stammmitglied Avatar von Matthias 321
    Registriert seit
    09.09.2009
    Ort
    nahe Nürnberg
    Beiträge
    35
    Es funktioniert so aber nicht, ich denke sternst hat recht. Mit text[15] geht's, obwohl das in meinen Augen am wenigsten Sinn macht. Aber wenn das die "Endekennung" ist, solls mir recht sein, solang es funktioniert!

    Uh, guckt der Smylie böse, ist nicht so gemeint... ^^
    Vergesslichkeit ist doch recht nützlich: Man spart viel Zeit

Ähnliche Themen

  1. [ERLEDIGT] Ideen zum Quellcode
    Von Tobias Stosius im Forum Asuro
    Antworten: 13
    Letzter Beitrag: 25.05.2011, 14:18
  2. LDR Quellcode
    Von Jada im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 03.06.2010, 19:26
  3. Quellcode für Geschwindigkeitsmessung
    Von Tanja1986 im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 12.10.2008, 12:53
  4. Bootloader 1.3 quellcode???
    Von raid_ox im Forum Asuro
    Antworten: 41
    Letzter Beitrag: 10.11.2007, 11:25
  5. Quellcode zu RNKC10
    Von Kjion im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 3
    Letzter Beitrag: 19.06.2005, 15:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress