Wie Konsole nach dem Booten von der serieller Schnittstelle lösen

snowyrain

Neuer User
Mitglied seit
31 Jul 2006
Beiträge
125
Punkte für Reaktionen
0
Punkte
16
Hallo,

ich habe gerade wieder freie Wochenenden und suche ein kleines Bastelprojekt. Ich würde gerne einen ATmega 8L (2,7-5,5V / max. 3,6mA) an meine W501V (mit Freetz) anschließen. Hierfür würde ich gerne die serielle Debug-Schnittstelle nutzen. Die Konsolenausgabe sollte beim Booten weiterhin über die Konsole gesehen und der später ausgeschaltet werden. Hier wird in vielen Threads darüber gesprochen wie man am besten die TTY nutzen könnte, ich habe leider nichts konkretes gefunden die TTY via Programm von der Konsole zulösen und nur als /dev/ttySx anzusprechen.

Ziel ist es einen I2C Temp-Sensor auszulesen und den Wert auf einer HTML-Seite darzustellen (Ohne wirklichen Nutzen für mich direkt, aber es ist ein Ziel :D ).

Etwas kenne ich mich mit der Materie aus, leider nicht mit den genauen Fritzbos interna.

Gruß

Snowyrain.
 
Das ganze wurde [URL="http://www.ip-phone-forum.de/showthread.php?t=157790]hier[/URL] schonmal ziemlich ausführlich thematisiert; so wie ich es verstehe mit dem Ergebnis 'geht so nicht'. Aber lies am besten selbst nach.
 
Hallo snowyrain,
das ist doch eine schöne Idee, zumal man den AtMega ohne weitere Bauteile, alleine mit den 4 Signalen der seriellen Schnittstelle betreiben können sollte. Am einfachsten kommst Du aber sicherlich zum Ziel, wenn Du auf diese Forderung verzichtest:
Die Konsolenausgabe sollte beim Booten weiterhin über die Konsole gesehen und der später ausgeschaltet werden.
Da Du ja Freetz benutzt, musst Du - im Falle des Verzichtes - nur einen neuen Kernel ohne "serielle Console" generieren und die Schnittstelle "gehört Dir". Lediglich der Bootloader benutzt dann noch die serielle Schnittstelle, aber das sollte ja nicht stören, man kann den AtMega ja "ruhig halten" und erst noch erfolgtem Hochlauf mit einer V24-Kommandosequenz aktivieren. Ich habe das mit einer älteren Box, noch mit ds-mod für Kernel 2.4 mal gemacht, hat prima funktioniert.
Wenn die Forderung bestehen bleibt, gibt es - soweit mir bekannt - nur unbefriedigende Lösungen. Am besten wäre es den seriellen Treiber zu modifizieren...

Gruss, Reiner
 
Hallo,

vielen Dank für die Antwort. Ich lag fast eine Woche ziemlich daneben und habe den PC erst jetzt wieder an. Ich habe einen Atmega auf eine Lochrasterplatine gelötet. Nach meinen Infos braucht man einen externen Quarz, da der interne zu ungenau ist. Also nicht ganz ohne extra Bauteile (sind aber nur 3). Eine Debug-LED ist noch dran. Und ein Stecker für I2C ist auch drauf, aber noch ungenutzt. Zurzeit läuft nach einer Initialisierungs-Phase der Atmega im seriellen loopback Modus.

Ich werde mal suchen wie man einen Kernel ohne "serieller Konsole" zubauen hat. Über Tips wäre ich natürlich dankbar. :cool:

EDIT:
Habe den Eintag gefunden, "make kernel-menuconfig" aufrufen, und dann:
-> Device Drivers -> Character devices -> Serial drivers -> 8250/16550 and compatible serial support: aktivieren
-> Device Drivers -> Character devices -> Serial drivers -> Console on 8250/16550 and c ... : deaktivieren

Jetzt läuft alles durch. Das kann noch dauern ;-)

Mit freundlichen Gruß

Snowyrain
 
Zuletzt bearbeitet:
Moin,

das mit dem Externen Quarz oder Oszillator für den AtMega kann ich bestätigen. Ohne den kannst du jegliche Kommunikation über die Serielle Schnittstelle vergessen.

Auch mit Quarz oder Oszillator ist der AtMega mit der Seriellen Schnittstelle etwas hakelig. Verlass dich also nicht darauf, dass du alle BAUD Raten nutzen kannst.

--
Schwigi
 
Hallo,

ich habe diesen Thread mit großem Interesse gelesen.
Ich versuche aktuell, den Wert eines I2C Ultraschallsensors von einem ATmega8 über seriell an eine FB3020 zu senden.

Zuerst die Beschaltung:
die FB benötigt ja LVTTL-Pegel, also 3,3/0V, die FB hat aber TTL (5/0V), also habe ich an den TxD des ATmega8 einen Spannungsteiler mit einem 2k2 und 3k3 Widerstand drangehängt, um aus den 5V 3,3V zu machen. Der ATmega wird mit einem 4MHz Quarz betrieben, die Fusebits habe ich entsprechend eingestellt.

Bei der Verbindung zwischen FB und ATmega habe ich jeweils gekreuzt, also RxD der FB verbunden mit dem TxD des ATmega und umgekehrt. Weiterhin ist die Masseleitung verbunden.

Code-technisch habe ich mich an
http://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc gehalten. Hier habe ich sowohl die Version ohne als auch die mit Interrupts probiert, beide erfolglos.

Die Fritzbox läuft mit dem DaniSahne-Mod [3020_04.34-ds26-15.2]. Im Kernel habe ich wie oben beschrieben die Option für die Serielle Konsole DEaktiviert.

Ich habe dann mit dem Tool stty die Baudrate von /dev/ttyS0 auf 9600 gestellt, welche auch entsprechend im Code des Atmel eingestellt ist.
Code:
stty -F /dev/ttyS0 9600
Default der FB sind ja 38400baud, damit habe ich es auch schon probiert.

Wenn ich letztlich alles gestartet habe und auf der FB ein
Code:
cat /dev/ttyS0
ausführe, kommt einfach nichts an!

Mit
Code:
cat /proc/interrupts
sehe ich auch, dass die Interrupts eingehen, der Wert für 'serial' wird stetig um eins inkrementiert.

Interessant ist auch: wenn ich die FB mit verbundenem ATmega starten möchte bootet sie nicht!

Hat jemand eine Idee wo der Fehler sein könnte?

Gruss,
mefiX

P.S.: Der Code
Code:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "delay.h"
#include "lcd.h"
#include "uartni.h"
#include "i2cmaster.h"

#ifndef SIGNAL
#include <avr/signal.h>
#endif /* SIGNAL */

#ifndef F_CPU
#define F_CPU 4000000UL
#endif

void uart_init_ni()
{
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);

    UBRRH = (uint8_t) (ubrr>>8);
    UBRRL = (uint8_t) (ubrr);

    // UART Receiver und Transmitter anschalten
    // Data mode 8N1, asynchron
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
    do
	{
        UDR;
	} while (UCSRA & (1 << RXC));
}

static inline int
uart_putc (const uint8_t c)
{
    // Warten, bis UDR bereit ist für einen neuen Wert
    while (!(UCSRA & (1 << UDRE)))
        ;

    // UDR Schreiben startet die Übertragung
    UDR = c;

    return 1;
}

int main(void)
{
	char buf[64];
	unsigned int dist;
	unsigned char fill_percent;

	i2c_init();
	uart_init_ni();

	DDRB |= (1 << PB0); /* enable B0 as Debug-LED-output */

    /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);

	sei();

    for ( ;; ) 
	{
		uart_putc('A');
		uart_putc('\r');
		uart_putc('\n');
		uart_putc('\0');
		delayms(100);
	}
}
 
Zuletzt bearbeitet:
Hallo nochmal,

jetzt gehts *juhuuuu*

ich habe alles so gelassen, mich aber dazu entschlossen, die Lib von Peter Fleury zu nutzen, damit klappte es auf anhieb.

Gruss,
mefiX
 
EDIT:
Habe den Eintag gefunden, "make kernel-menuconfig" aufrufen, und dann:
-> Device Drivers -> Character devices -> Serial drivers -> 8250/16550 and compatible serial support: aktivieren
-> Device Drivers -> Character devices -> Serial drivers -> Console on 8250/16550 and c ... : deaktivieren

Jetzt läuft alles durch. Das kann noch dauern ;-)

Sorry dass ich diesen alten Thread nochmal raushole. Hat das bei Dir geklappt, die ausgaben auf die Konsole damit zu deaktivieren?
Ich will die Serielle Schnittstelle an meinem Speedport zur Datenerfassung nutzen.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.