Archiv verlassen und diese Seite im Standarddesign anzeigen : Kompass-Modul / Atmega128 umstellung
Salü
1. Gibt es Kompassmodule, die z.B. über I2C angesprochen werden können?
2. Ich habe jetzt immer problemlos mit ATMEGA16er gearbeitet und brauche jetzt jedoch 2UART... OK, dachte ich, nehme einfach den 162er... Leider bemerke ich nun aber, dass er zwar 2UART's hat, jedoch fehlen ADC und I2C...
Nun bin ich mir nicht sicher, ob ich nen 128er nehmen soll. Jedoch habe ich von Problemen mit diesem gehört oder ist die Umstellung kein Problem?
Ich möchte einfach kein Risiko eingehen...
Soll ich es "wagen" oder nicht?
Merci
ih glaub der 64 hat auf jeden fall auch 2 uart und 1 i2c! ist vllt noch günstiger...habe übrogens grade ähnliche überlegungen und anforderungen wie du
Jedoch habe ich von Problemen mit diesem gehört oder ist die Umstellung kein Problem?
ich wüsste nicht, worin die Probleme bestehen sollten
was du beachten solltest, ist, dass der nicht über die Pins vom SPI-Modul programmiert wird, sondern über andere, welche genau steht im Datenblatt( ich hab was mit uart0 in Erinnerung )
pebisoft
10.10.2005, 21:19
1. Gibt es Kompassmodule, die z.B. über I2C angesprochen werden können?
cmps03 bei "roboter-teile.de"
mfg pebisoft
Also... Ich habe jetzt eine Platine mit dem ATMEGA162 aufgebaut... Funktioniert (fast) alles prima!
Ich habe nur das Problem, dass irgendwas mit der Frequenz nicht stimmt...
Beim UART will einfach nicht das richtige Zeichen durchkommen, sprich am PC kommt irgendein char an und nicht das gewünschte!
Den UBBR-Wert (externer 16Mhz Quarz) hab ich nachgeschaut ist 103... Das sollte stimmen... Alles andere müsste eigentlich auch stimmen, da ich mit dem UART nie wirklich Probleme hatte!
Das einzige was mir Sorge bereitet sind die FuseBits... Ja, ich habe schon die Suchfunktion benützt, jedoch nicht viele Antworten bezüglich dem Ponyprog gesehen... Ich benutze dieses und weiss wirklich nicht so genau, wo jetzt ein Häckchen hin soll oder wo nicht. Momentan habe ich lediglich beim CK/8 und Bodlevel eines gesetzt...
Könnte mir nicht mal vielleicht jemand einen Screenshot seiner Bits für den 162er geben? Da sieht sowieso alles ein bisschen anders aus und mit dem Datenblatt gibt es bei mir nur verwirrungen ;-)
Wäre super!
Momentan habe ich lediglich beim CK/8 und Bodlevel eines gesetzt.
Das würde erklären warum der UART nicht richtig funktioniert. Dein Controller läuft nämlich nur mit 2 MHz ( halt Clk / 8 ) :-)
Wenn du also das Häckchen bei CKDIV8 wegmachst sollte alles laufen.
EESAVE ist vielleicht noch ganz interessant wenn du mit dem Eeprom arbeitest. Damit schütz du den Inhalt des Eeproms beim neuprogrammieren des Chips.
SUT0 programmiert sollte die längste Start-up Zeit einstellen, sinnvoll wenn du ohne Brown-Out-Detection arbeitest ( siehe Seite 37 Datenblatt ).
Für BODLEVEL[2:0] wäre 101 oder 100 eine sinnvolle Einstellung ( wobei man aufpassen muss, eine 1 bedeutet kein Häckchen bei PonyProg ), das würde eine Brown-Out Detectionlevel von 2,7 Volt oder 4,3 Volt einstellen. ( siehe Seite 48 ).
Den Rest brauchst du erstmal nicht.
MfG Kjion
Aha. Danke Kjion...
Nur dummerweise habe ich das mit dem Clk/8 schon ausprobiert und dann einfach ein noch falscheres Zeichen bekommen :-P
Was ich auch komisch finde ist, dass es teilweise richtig durchkommt... wenn ich ein ´h´ sende, dann kommt einfach ´Chx´wobei x ein ASCII zeichen ist, welches als Musiknote dargestellt wird...
Ich versteh das nicht... :-P
Oje...
Womit programmierst du denn ?
Es könnte sein das der ATMega162 eine leicht andere Ansteuerung des UARTs braucht ?? Müsste ich aber erst nochmal nachschauen...
MfG Kjion
Also ich habe jetzt nochmals die FuseBits kontrolliert und sollten stimmen...
Zudem habe ich mit CKOUT die Quarzfrequenz gemessen und sie Beträgt genau 16MHz.
Nur leider will mein UART immer noch nicht! Jetzt kommen am PC gar keine Zeichen mehr an!
Ich poste mal meinen Code. Ich hoffe jemand kann mir helfen...
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
int main(void)
{
DDRB=0xFF;
DDRD=0x00;
UBRR0H = (103>>8);
UBRR0L = 103;
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<URSEL0)|(1<<UCSZ10)|(1<<UCSZ00);
while(1)
{
UDR0='h';
}
}
Merci
Aha... Es funktioniert!!!! Super!
Jetzt weiss ich nur noch nicht wie die verschiedenen Interrupts heissen für UART0-Dateneingang und dem vom UART1? Oder ist das derselbe und man muss nur das jeweilige Register auslesen?
Also ich meine das SIGNAL(SIG_UART_RECV) für den UART1 oder UART0...
Danke!
SprinterSB
02.11.2005, 10:20
Vor dem Senden solltest du warten, bis die Daten raus sind. Sonst stopfst du x-mal Zeug in UDR rein, bevor's verdaut ist. Im Handbuch sind auch Codeschnippsel:
/* Wait for empty transmit buffer */
while (!( UCSR0A & (1<<UDRE0)))
;
/* Put data into buffer, sends the data */
UDR0 = data;
SprinterSB
02.11.2005, 10:25
/* Interrupt vectors (byte addresses) */
#define SIG_INTERRUPT0 _VECTOR(1) /* External Interrupt Request 0 */
#define SIG_INTERRUPT1 _VECTOR(2) /* External Interrupt Request 1 */
#define SIG_INTERRUPT2 _VECTOR(3) /* External Interrupt Request 2 */
#define SIG_PIN_CHANGE0 _VECTOR(4) /* Pin Change Interrupt Request 0 */
#define SIG_PIN_CHANGE1 _VECTOR(5) /* Pin Change Interrupt Request 1 */
#define SIG_INPUT_CAPTURE3 _VECTOR(6) /* Timer/Counter3 Capture Event */
#define SIG_OUTPUT_COMPARE3A _VECTOR(7) /* Timer/Counter3 Compare Match A */
#define SIG_OUTPUT_COMPARE3B _VECTOR(8) /* Timer/Counter3 Compare Match B */
#define SIG_OVERFLOW3 _VECTOR(9) /* Timer/Counter3 Overflow */
#define SIG_OUTPUT_COMPARE2 _VECTOR(10) /* Timer/Counter2 Compare Match */
#define SIG_OVERFLOW2 _VECTOR(11) /* Timer/Counter2 Overflow */
#define SIG_INPUT_CAPTURE1 _VECTOR(12) /* Timer/Counter1 Capture Event */
#define SIG_OUTPUT_COMPARE1A _VECTOR(13) /* Timer/Counter1 Compare Match A */
#define SIG_OUTPUT_COMPARE1B _VECTOR(14) /* Timer/Counter1 Compare Match B */
#define SIG_OVERFLOW1 _VECTOR(15) /* Timer/Counter1 Overflow */
#define SIG_OUTPUT_COMPARE0 _VECTOR(16) /* Timer/Counter0 Compare Match */
#define SIG_OVERFLOW0 _VECTOR(17) /* Timer/Counter0 Overflow */
#define SIG_SPI _VECTOR(18) /* Serial Transfer Complete */
#define SIG_USART0_RECV _VECTOR(19) /* USART0,Rx Complete */
#define SIG_USART1_RECV _VECTOR(20) /* USART1,Rx Complete */
#define SIG_USART0_DATA _VECTOR(21) /* USART0 Data Register Empty */
#define SIG_USART1_DATA _VECTOR(22) /* USART1 Data Register Empty */
#define SIG_USART0_TRANS _VECTOR(23) /* USART0,Tx Complete */
#define SIG_USART1_TRANS _VECTOR(24) /* USART1,Tx Complete */
#define SIG_EEPROM_READY _VECTOR(25) /* EEPROM Ready */
#define SIG_COMPARATOR _VECTOR(26) /* Analog Comparator */
#define SIG_SPM_READY _VECTOR(27) /* Store Program Memory Ready */
Und das bekommst du wie gewohnt mir <avr/io.h>
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.