Hallo,
ich habe eine Frage zu dem AT90PWM2/3 der das DALI Protokoll beherrschen
soll.
Heißt das nun das der Microkontroller direkt ein Steuersignal für ein
Dali-EVG erzeugen kann? Leider werde ich nicht daraus schlau wenn es
heißt das der Kontroller das Dali-Protokoll unterstützt.
Hi
Hab zwar noch nicht mit dem PWM2/3 gearbeitet (dafür schon mit DALI)
aber was ich gesehen habe erzeugt der Controller (sofern richtig
konfiguriert) grundsätzlich schon ein richtiges DALI Signal (also 16Bit
Frame, bi-phase) - nur halt auf Logikpegel (so wie ein normaler Uart
auch, wo du dann noch z.B. einen MAX232 dranhängst um RS232 Pegel zu
haben).
Um EVG's anhängen zu können brauchts also noch ein wenig
Außenbeschaltung. Hier gibts einige Aplikationnotes dazu (google mal ein
wenig dann findest du sicher was - "dali schematic" z.b.). Unsere Lösung
in der Firma besteht im wesentlichen aus 2 Optokopplern, 4 Dioden, 1
Z-Diode, 1 Transistor und 2 Widerständen.
Beachte aber das du auch noch ein Dali-Netzteil benötigst welches den
Bus entsprechend versorgt.
MfG Oli
Hallo,
ich arbeite zur Zeit an einem Projekt an der HTL, ebenfalls mit einem
AT90PWM2. Jedoch ist es mir noch nicht gelungen, den µC richtig zu
konfigurieren. Hat es bei dir geklappt? Wenn ja, könntest du mal den
Programm-Code posten? Es wäre nett, wenn sich sonst noch jemand melden
würde, der Ahnung von dem Thema hat.
mfg Daniel
>Jedoch ist es mir noch nicht gelungen, den µC richtig zu>konfigurieren.
Sehr weitläufige Beschreibung des Problems...
Was genau will denn nicht funktionieren?
Welche Revision hast Du von dem Teil? Die Erste Serie A oder schon ein
B?
Die A hatte auch noch ein paar nette Bugs bzw. ein paar Kleinigkeiten,
auf die man achten muss!
Ich versuche ein DALI-Frame zu schicken mit 16 Bit, jedoch kommen nur
die ersten 8 richtig an, die anderen 8 haben für mich keine Logik. Das
Bit-Muster sieht fast immer gleich aus. Ich benutze den AT90PWM2B Ich
poste mal mein Programmcode und das Ausgangssignal:
#include "io.h"
#include <avr/interrupt.h>
#include "signal.h"
#include <util/delay.h>
void EUSART_Transmit_data( unsigned int data )
{
// Wartet, bis Transmit lehr ist
while ( !( UCSRA & (1<<UDRE)))
//Die datei wird in den Buffer geladen und dann gesendet
EUDR = data>>8;
UDR = data;
}
int main (void)
{
//UCSRA =
;
UBRRL = 50; //Setzt Baudrate des Transmitters auf 1200;
UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2;
MUBRR = 833; //Setzt Baudrate des reveivers auf 1200 und Frequenz auf
1MHz
EUCSRA = 0b10110111; //Hier wird die Anzahl der zu senden Bits
eingestellt (16)
EUCSRB = 0b00011010; //EUSART-Mode wird eingeschaltet
UCSRB = 0b00011000; //EUSART Transmitter wird eingeschaltet
unsigned int data = 0b1010100101111001;
//unsigned int data = 0b1001111010010101;
EUSART_Transmit_data(data);
while(1)
{
}
}
Wie man im Bild sehen kann, sind die ersten 8 Bit richtig, die anderen
nicht mehr. Es sollte eigentlich gleich aussehen, wie das Bsp. im
Datenblatt des µC.
vielen Dank für die Hilfe!
mfg Daniel
Da ist ein Fehler....
void EUSART_Transmit_data( unsigned int data )
{
// Wartet, bis Transmit lehr ist
while ( !( UCSRA & (1<<UDRE)))
{
};
//Die datei wird in den Buffer geladen und dann gesendet
EUDR = data>>8;
UDR = data;
}
Sollte es mit diesem Code funktionieren? Es erscheint mir ein bisschen
komisch, dass dieser Teil falsch sein soll, weil es eigentlich direkt
aus dem Datenblatt genommen wurde. Werde es aber trotzdem mal
ausprobieren.
Also dafinitv wartet die erste Version nicht bis der Puffer leer ist,
sondern schiebt permanent die Daten un EUDR.
Es fehlen die Blockklammern, oder ein simples Semikolon.
while ( !( UCSRA & (1<<UDRE)))
//Die datei wird in den Buffer geladen und dann gesendet
EUDR = data>>8;
Des weiteren würde Ich jedoch empfehlen die verwendete Schaltung auf
Standardkonformität - insbesonere im Punkt "Flankensteilheit" - zu
Prüfen.
Hallo Experte, hab eine Frage zu dem Register
warum steht da die 50 und das andere Register UBRRH nichts?
kann mir jemand das beantworten.
Danke
UBRRL = 50; //Setzt Baudrate des Transmitters auf 1200;
An alle Profis hier,
hab den Code mit dem gleichen at90pwm216, versucht grad zu übernehmen
und an max232 zu übertragen. zeigt natürlich nichts an.
wer weis warum nicht?
Tut mir leid für die späte Antwort. Auf das UBRRL-Register bin ich durch
probieren drauf gekommen.
An Mathes: Hast du konrolliert, ob die Register auch in deinem µC
vorhanden sind? Ich habe bei den meisten Register ein Kommentar
dazugeschrieben, vergleich mal im Dattenblatt, ob die Funktionen
übereinstimmen. Kannst du den Code ohne Fehler kompelieren?
mfg Daniel
ja hab ich, benutze aber ein EXternen Quartz 4 MHz,
benutze den at90pwm216 auf dem stk520 bord.
die register sind die gleichen. hatte auch so gemacht befor ich dein
code gesehen hab. es funkts bis heut nicht.
was mich noch verwundert ist das die dali klem. auf dem stk520 nur eine
span. von 5 volt hat und der dali benötigt doch viel höchere spannung
für transmit.
Du bekommst keine Fehlermeldungen beim compelieren und keine Fehler beim
Programmieren des µC's? Probier mal einfach einen Port immer wieder zu
toggeln, in dem du eine while-Schleife benutzt, um zu sehen, ob der Port
das macht, was du ihm programiert hast.
mfg Daniel
hallo, die while steht bei mit in der main()
while(1)
{
EUSART_Transmit(s);
}
nur wenn ich den baten neben con. drück und zwar den write flash memory
findet die übertragung stat, sonst nicht. das ist auch nicht normal.
hast du bei deinem dali code die Interrupts auch benutzt?
Daniel ich hab heut den register sogar auf 8 bit in senderichtung
umgestellt, er sendet aber viel mehr bits als die 8. warum, was mache
ich falsch?
mfg
mathes
Ich habe als erstes auch den STK500 verwendet, da hat die Programmierung
nur bis ca. zur hälfte geklappt. Jetzt verwende ich den AVR-Dragon, mit
dem geht es ohne Probleme. Post mal deinen Code, vielleicht seh ich da
was falsches. Ich hab keine Interrupts verwendet, immer mit dem Reset
den µC geresetet.
mfg Daniel
Ich verwende stk500 und oben drauf den stk520 für den at90pwm216.
Hab dein code übernommen außer in der main funktion die werte:
UBRRL = 207; //hab 4 MHz extern Quarz
MUBRR = 833;
es kann bestimmt noch an den Fuse Bits liegen, laut datenblatt muss
Register
CKSEL3..0 1111-1110 haben. wenn ich Con. kommt da so ein Fenster mit
Fuse Bits. da gibts das register nicht :-)
hast vieleicht eine idee?
Ja das kann sein, dass etwas mit den Fuses nicht stimmt. Mit einem Fuse
kann man einstellen, was für ein Quarz man hat (extern oder intern).
Kann dir leider aber grad nicht nachschauen. Ich kann dir aber morgen
nachschauen, wie das Fuse bei mir heißt.
mfg Daniel
Hallo Daniel,
meine Bits sind ok,
jetz sofort die nächste frage.
wie hast du den DALI Bus mit spannung versorgt?
wenn du in besitz einer schaltung bist kannst du die mal hier posten.
mfg
mathes