-
Thread
Multitasking mit Assembler
Rolle? Meinst du denn ein Pic, ein ARM oder ein Intel kennt die gleichen Assemblerbefehle wie ein 8 Bit Atmel µC? Selbst innerhalb einer Familie spielt es eine Rolle, denn je nach Chip hat der uU unterschiedliche Timer und unterschiedliche Interrupts.
mit passender Priorisierung. Das ganze in assembler nachzubilden ist ziemlich aufwändig, jeder einzelne Task muß gesichert werden und gewährleistet das die Zeitscheiben auch eingehalten werden. Sinnvoller ist da schon das genannte, denn das paßt erstens in einen µC gut hinein und macht zweitens keinen
-
Thread
Es geht einfachnicht in meinen Kopf rein.
r16,PortC ; Inhalt von Port C ins Register 16 sbr r16,192 ; Bit 8 und 7 setzen 128 + 64 sbis PIND,PIND5 ; Überspringe den nächsten Befehl, fals Bit 5 in PIND gesetzt ist cbr r16,128 ; Bit 8 löschen
@Holger P. Dein Code [avrasm] lds r16,PortC ; Inhalt von Port C ins Register 16 sbr r16,192 ; Bit 8 und 7 setzen 128 + 64 sbis PIND,PIND5 ; Überspringe den nächsten Befehl, fals Bit 5 in PIND gesetzt ist cbr r16,128 ; Bit 8 löschen
-
Thread
Läuft µC auch ohne Bootloader?
richtig verstanden habe, dann kann ich mit [avrasm]sbic[/avrasm] bzw. [avrasm]sbis[/avrasm] die einzelnen Ports abfragen, wenn diese dementsprechend als Eingang definiert sind, oder? Mit freundlichen Grüßen Seikuassi
Frage beantwotert: http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Zugriff_auf_einzelne_Bits Und alle weiteren auch. Unglaublich.
-
Thread
Druck und Höhensensor MPL3115a2
Ja das Problem war, dass ich beim zusammensetzen des 12 Bit Registers die einzelnen Bytes auf long int casten musste. Ohne casten gab es halt immer einen Überlauf bei der Berechnung, was zu einem Fehlerhaften Ergebnis führte. [c] 338 // Druck
mal so lange dauert bis der Sensor abschmiert. Hi Marcel, leider verliere ich auch bei 10kHz I2C-SCL nach einigen Minuten die Verbindung (1 Abfrage/s. Da du oben für 'altitude' einen 'int' angegeben hast, nehme ich an, dass du dein Programm auf einem PC und nicht auf einem AVR laufen lässt. Ich
-
Thread
PWM über serielle Schnittstelle
bricht aktuelle Eingabe ab: tmp_Zahl = -1; } } } ... [/c]
eigentlich ist das ziemlich simpel, wenn man ein bischen Übung in der Programmierung hat. Speziell einen einzelnen 8-Bit Wert per UART zu übertragen ist nicht wirklich Raketentechnik. Bei mehr Bytes bzw. wenn es sich jetzt um einen 16-Bit Wert handelt, wird das schon ein wenig schwieriger. Hast du dir denn
-
Thread
Process wird kontinuierlich durchloffen - Altium LiveDesign Board
" wird. Z.B mit Bedingungen, dass der Process mit code_static nur ausgeführt wird, wenn das rechte Bit ungleich dem Mittleren, und der Process mit usignal nur ausgeführt wird, wenn das Mittlere ungleich dem Linken ist. Die einzelnen Bits werden dannin den Processen an der richtigen Stelle jeweils mit
Daher ist es zwingend notwendig, mit Takten zu arbeiten, damit die Zeitpunkt von Zuweisung und Abfrage klar definiert sind und die Inhalte stabil sind. Das ist völlig anders in C, wo alle Bits eines Worts immer gleichzeitig geschrieben und gelesen werden (weil die CPU getaktet ist). Ohne Takt passiert
-
Thread
Probleme und Anregungen mit USART auf ATMega32
write_idx] = UDR;" in die IF-Abfrage rein nimmst, wird UDR beim Überlauf des Schreibindexes nicht in das Array übertragen! Schreib es besser so: [c] ISR(USART_RXC_vect) { if (write_idx < 200) { write_idx++; }
im gegensatz zum µC (16MHz) mit 19200baud recht langsam ist (19200/10Bit Wortlänge = 1920 Zeichen pro Sekunde). Daher warte ich je nach eingestellter Bautrate min. die Zeit von einem Zeichen + 20% bis ich zurück gebe ob
-
Thread
Mit 8051 auf Display schreiben
Hallo, ich versuche gerade über Memory Mapped(8-Bit Interface), also vom 8051er ausgesehn, das Display wie einen externen RAM zu benutzen, Glue Logic halt. Die IDE ist Keil und Programmiersprache C. Hier mein bisheriger Code: http://pastebin.com
Charakters lang, d.h. 1-4, 4-8 etc. Wenn ich schreibe: printf("hallo\t"); dann werden ja die Zeichen einzeln in putChar(http://www.keil.com/support/man/docs/c51/c51_putchar.htm) eingelesen und aufs Display ausgegeben. Wenn aber nach dem 'o'(das wäre jetzt der 5te character) ein \t kommt, also ein tabulator
-
Thread
Glcd Anzeigefehler
>Jetzt gehts einzeln mit den Linien und >dem Text aber Zusammen Fehlalarm Oh, oh. Was geht denn da jetzt wieder nicht? Bild machen;)
sowas Genau wie ich es Dir im letzten Beispiel gezeigt habe, nur das dieses mal als Bedingung PinC.1 eine logische 1 haben muss. Das Y kannst Du wieder mit Select Case Y abfragen. Ich würde Dir empfehlen, die Beispiele von Bascom anzusehen, auch in der Hilfe gibt es jede Menge Informationen.
-
Thread
Programmierung in C für MSP430/Output und Input
while(1) { if(P1IN & PIN5) //Port1.5 abfragen ob 1 { P1OUT = PIN0; //solange Port1.0 einschalten } } } [/c]
anderes hängen, das Du /nicht/ einschalten willst. Und da kommen die Bitmanipulationsfunktionen von C ins Spiel: [c] while (1) { if (P1IN & PIN5) // Port1.5 abfragen ob 1 { P1OUT |= PIN0; // solange Port1.0 einschalten } else { P1OUT &= ~PIN0;
-
Thread
Hardware PWM Timer1 funktioniert nicht
8 Bit und ohne Vorzeichen. ) [C] ISR(TIMER1_COMPA_vect) { Servo_Port = 0x00; Servo_ID++; if( Servo_ID == Servo_quantity ) Servo_ID = 0; Servo_Port = Servo_Bit[Servo_ID]; OCR1A += current_position[Servo_ID]; } [/C]
-
Thread
Mega32 im C64
sämtliche andere Aufgaben wie IEC Bus und SD Card Bus ansteuern. Das ist definitiv nicht mit einem einzelnen ATMega möglich. In den 70ern wurden die Konstrukteure von solchen Dingen als Pioniere und Genies vergöttert, heute bekommen Menschen die eine komplette CPU per Bit und Byte und Assembler, ein
Jahre alte Stücke bei eBay und sonst wo. Klar) Die Intention dahinter ist, einen fast kompletten C64 mit 8 Bit AVR Controllern zu realisieren, ohne 32 Bit ARM CPUs und sonstiges dafür einzusetzen. Denn dann , lädt man sich einfach aufs Smartphone eine APP runter und spielt damit. Hier geht es um
-
Thread
C Anfängerproblem
Weil Du durch die Zuweisung immer alle 8 Bits auf einmal setzt. Wenn PORTB vorher 0b00000001 war und Du dann 0b00000010 zuweist, dann hat er danach eben den Wert 0b00000010 und nicht 0b00000011. Wenn Du nur einzelne Bits ändern willst, musst Du in C zuerst den alten Wert lesen, das Bit mit einer Maske ändern und den ganzen Wert wieder zurückschreiben: http://www.mikrocontroller.net/articles/Bitmanipulation
-
Thread
Einen ATmega 16 zum Arduino Standalone benutzen
ist super ;). Dazu noch 2 oder 4 Taster zusätzlich an den µC. Diese könnte ich über die anderen 4 analog-Eingänge auslesen.. Dann würde alles passen. Ich werde jetzt bei zeichelt nen neuen µC bestellen + ein bisschen Kleinkrams. Bin gespannt ob das alles funktioniert
über I2C erfolgen, nicht mehr mit der LiquidChrystal Library. Siehe auch: http://arduino.cc/playground/Code/LCDi2c > Außerdem möchte ich ein 4 Wege Joystick anschließen. > Die gegenüberliegenden Richtungen
-
Thread
AVR Einstieg / Probleme mit Programm Interrupt
Port komplett beschreibst. D.h. dein nächster Punkt lautet: Einzelbitoperationen an einem Port Bit setzen (am Beispiel Pin 3) PORTB |= ( 1 << PB3 ); Bit löschen PORTB &= ~( 1 << PB3 ); Abfragen, ob Bit gesetzt ist if( PIND & ( 1 << PD4 ) )
setzen (am Beispiel Pin 3) > > PORTB |= ( 1 << PB3 ); > > Bit löschen > > PORTB &= ~( 1 << PB3 ); > > Abfragen, ob Bit gesetzt ist > > if( PIND & ( 1 << PD4 ) ) Das habe ich natürlich auch schon umgesetzt. Macht das schreiben schon deutlich einfacher
-
Thread
SPI mit 2 Mastern und 2 Slaves entkoppeln
gegebenenfalls die Datenmenge von ca. 37 CAN-nachrichten, die in 9.2ms aufläuft buffern (9.2ms=16KB*9bit(=8bit daten plus 1 bit verschenkter cycle)/16MHz ist die Zeit die ich brauche um 16K am Stück vom FRAM auszulesen und an die SD-Karte zu schicken). Diese 37 (=9.2ms/(0.25ms/CANNachricht)) Nachrichten
ins FRAM zu schreibt - brauche ich so oder so. und dann sieht die "hauptschleife" wie folgt aus: [c]while (1) { sleep(); }[/c] Und auf der anderen Seite brauche ich nur einen IRQ handler der mich nach einen pin state change (z.b: pins FRAM1 und FRAM2 CS from "can-receiver" - vieleicht noch ein Pin
-
Thread
USART Fleruy lib auf ATMEGA88 - Problem bei hohen Datenraten
& UART_FRAME_ERROR ) { /* Framing Error detected, i.e no stop bit detected */ //uart_puts_P("UART Frame Error: "); } if ( c & UART_OVERRUN_ERROR ) { /* * Overrun, a character already
Dann werde glücklich damit, aber verstanden hast Du nicht warum man vor dem uartget c den Status abfragen MUSS.
-
Thread
Schwingkreis: Wahl Induktivität/Kapazität.
Verluste wenn die Energie in diese verlagert werden muss. Rein mathematisch bedeutete dies, dass L = C. Also für die Wahl z.B. des Kondensators: [math]f_0 = \frac{1}{2 \pi \sqrt{ C * C }}[/math] [math]f_0 = \frac{1}{2 \pi * C}[/math] [math]f_0 * 2 \pi * C = 1[/math] [math]C = \frac{1}{2 \pi * f_
groß sein. OK, dann gilt: [math]X_L = 2 * \pi * f_0 * L[/math] [math]X_C = \frac{1}{2 \pi f_0 * C}[/math] sowie [math]X_L = X_C[/math] bzw.: [math]2 * \pi * f_0 * L = \frac{1}{2 \pi f_0 * C}[/math] umgestellt nach L dann: [math]L = \frac{1}{(2 \pi f_0)^2 * C}[/math
-
Thread
STM32F4 Portpins mit Variabler setzen in C
[c] GPIOx->ODR = PortVal; [/c] Wobei GPIOx dein Port ist wo du die Bits setzen willst und PortVal das Bitmuster als INT mit 16 Bits ist. Heisst also, du musst deine 8 Bit INT in eine passende mit 16
schreiben. Damit kann ich dann flexibel irgendwelche Portpins nutzen. Ich müsste dann also die einzelnen 8 Bits der Variablen mit If abfragen. Wie selektiert man nun jeweils ein einzelnes Bit? Grüße Jörg
-
Thread
Auslesen eines Sensors mit I2C / AVR TWI
schau Dir die gesamte Kommunikation auf einem digitalen Oszilloskop oder LogikAnalyzer an. Da I2C (in der Regel) beliebig langsam sein darf, kannst Du es auch mal "zu Fuß" ohne TWI versuchen und die Signale mit LED's anzeigen. So kannst Du jedes Bit einzeln sehen und prüfen.
gibt allerdings auch Slaves, die gar keine Register haben. Die senden und empfangen typischerweise einzelne Bytes oder eine bestimmte Anzahl von Bytes. Z.B. kenne ich einen A/D Wandler, dem man einen Befehl als einzelnes Byte sendet und beim Lesen immer zwei Bytes liefert (16bit Integer). i2c_communication
-
Thread
LCD 202A Conrad und Atmega 8
komfortabler als String lcd_string("Hello World!"); while(1) { } return 0; } [/c] lcd_routines.c [c] // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/HD44780 // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Bitmuster übertragen for ( uint8_t i=0; i<8; i++ ) { lcd_data( data[i] ); } } [/c] lcd_routines.h [c] // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung // #ifndef LCD_ROUTINES_H
-
Thread
6 x 7-Segment 2 x Schieberegister mit SPI Atmega 8 GCC
emil schrieb im Beitrag #2914829: > Ich schaffe es schon nicht eine beliebige 8bit breite Bitmaske rüber zu > schieben, also meine [c]Bitwurscht[/c]. Dann musst du da eben damit anfangen. Du brauchst eine Funktion, der du einen uint16_t übergibst und die die 16 Bit eines nach
auf 0 Maske = Maske << 1; } } [/Code] Und schon hast du eine Funktion, die einen 8 Bit Wert an das Schieberegister rausgibt. Um 16 Bit ruaszugeben rufst du die halt 2 mal auf. Denn 2 mal 8 Bit sind auch 16 Bit [C] Send( LED ); Send( Segment ); [/C] Und damit das 595 dann
-
Thread
AVR TWI - Frage zu TWSTA
Hallo, ich habe eine Frage zu dem TWI START Condition Bit (TWSTA). Im Datenblatt (des ATmega324A) steht: > TWSTA must be cleared by software when the START condition has been transmitted. Wenn ich TWSTA wie im C-Code unten nach der Start Condition löschen
Hi Ich denke es ist einfacher TWCR mit einem 8-Bit Wert zu beschreiben, als einzelne Bits zu setzen oder zu löschen. Dadurch würde bei einem nachfolgenden Senden von SLA das Start Bit sowieso gelöscht werden, vermeide also TWCR |= ... und TWCR &= ..
-
Thread
Umstieg Windows -> Linux sinnvoll? Nicht für den DAU.
im Nachbarthread (und täglich grüßt das Murmeltier) habe ich mir heute das aktuelle Ubuntu 12.10 32-Bit auf einen Testrechner installiert. Als Hardwarebasis dient ein Foxconn G45M Mainboard (integrierte Grafik) mit C2D E8400, 4GB RAM und einer WD Velociraptor 150GB. Mein letzter Versuch (V 8.10) liegt
nicht drin, crasht beim Start. 192MB geht aber problemlos. Wobei der Windows Server seit 2008R2 ein 64-Bit System ist, als 32-Bit System gibt es ihn nicht mehr.
-
Thread
mehrere Taster gleichzeitig abfragen (ATTINY 85)
Hallo Leute, ich beschäftige mich seit einigen Tagen mit folgendem Problem: ein uC (tiny85), eine LED, zwei Taster. Wenn TASTER1 gedrückt -> LED soll langsam blinken Wenn TASTER2 gedrückt -> LED soll schnell blinken funktioniert soweit, aber: Wenn TASTER1 und TASTER2 gedrückt -> LED soll abwechselnd kurz und lang aufleuchten. Das habe ich noch nicht hinbekommen. Weiterhin: Ich drücke TASTER1, LED leuchtet lang. Währendessen drücke ich TASTER2 und möchte dass die LED, nachdem sie eine lange Periode geleuchtet hat, nochmal kurz aufleuchtet. meine Abfrageroutine sieht so aus: [c] void request
-
Thread
Poti Wert zu PWM Signal verarbeiten
liegt vermutlich der Wurm. ADSC ist 1, solange die Messung durchgeführt wird. Also müsstest Du die Abfrage so machen: [C] while(ADCSRA & (1<<ADSC)) { } [/C]
(!(ADCSRA & (1<<ADIF))) // { // } // ADCSRA |= (1<<ADIF); // sensorWert3 = ADCW; } [/c] Sodass das ADIF Bit gesetzt (und damit gelöscht) wird und auch dieses abgefragt wurde. Das Flackern ist weg und die LED an PB1 ändert sich nicht mehr anch dem poti, wobei ich mir aber noch nicht
-
Thread
Windows 8 potthäßlich
wir einig. Die Struktur ist sinnvoll. Was nicht sinnvoll ist, sind sprachabhängige Namen für die einzelnen Zweige. "Eigene Dateien" heißt unter *nix traditionell ~ und wird von der Shell zum aktuellen Pfad expandiert - und das überall auf der Welt. Der erst relativ neue Ordner c:\users (oder so
schrieb im Beitrag #2906488: > Was nicht sinnvoll ist, > sind sprachabhängige Namen für die einzelnen Zweige. Siehe da, genau das wurde unter Vista abgeschafft. Uhu Uhuhu schrieb im Beitrag #2906488: > Der erst relativ neue Ordner c:\users (oder so ähnlich) ab Vista heißt > unter *nix
-
Thread
2-Stellige 7-Segment Anzeige im Multiplexbetrieb
keine Rolle) Nun: ein DIP-Schalter wäre ja doch dann P1.1 als beispiel. Das ist doch nur ein einzelnes Bit,wie kann ich dann dort eine ganze Zahl anlegen? Das ist mir nun ein Rätsel..
LoTTo schrieb im Beitrag #2901670: > aber Diese 'Schleifen' kann ich ja doch dann nur in C programmieren,aber > nicht mit Assembler,oder? Schleifen, (bedingte) Abfragen, Zuweisungen: Das sind alles die "Grundbausteine" von Algorithmen, egal ob die in C, Assembler, oder in "Pseudocode"
-
Thread
Atxmega128B1 If abfrage
nämlich nicht. andi schrieb im Beitrag #2891153: > Hallo Matthias auf, > wie würde dann eine Pin-Abfrage auf Pin E0 denn aussehen... Jo, bin jetzt auf... Sieht z.B. so aus, der Taster geht auf Masse, wenn gedrückt. Deswegen aktiviere ich noch den Pullup des Pins: [c] #define BUTTON0 PIN0_bm #define
Auszug. In diesem Fall passt das schon. Beim Xmega sind die Register DIRCLR bzw. DIRSET dafür da, einzelne Bits mit einer Anweisung zu setzen/löschen. @Andi: Poste am besten mal dein komplettes Programm, wie es aktuell ist und sage genau, was es machen soll und was stattdessen es macht. Der Code von
-
Thread
if-Abfragen verpönt?
A. K. schrieb im Beitrag #2889430: > Beispiel: GCC für ARM(e) macht aus einer if-Abfrage > cmp r0, #99 > movgt r0, #0 Und das ist besser als eine einzelne AND-Instruktion? Abgesehen davon, dass das egal ist, weil man auch auf 'nem µC heutzutage normalerweise
> Sind if-Abfragen so verpönt? Nein, überhaupt nicht, zumindest nicht in C. [c] if (buffer_write_index >= buffer_size) buffer_write_index = 0; [/c] Das ist für mich etwas holprig zu lesen, funktioniert
-
Thread
Tastenschlagzeug mit NXP LPC 935 selber bauen
ausgewertet und es kommt genau das heraus, was du auch schon vermutet hast. Das LSB ist das erste Bit und das MSB das letzte Bit eines Bytes in der Übertragung. Ich habe das erste Bild mal mit ungefähren Bitmarken versehen und man sieht dann schön die einzelnen Daten. Erstes Byte 10011111 = Befehl
Programm selber auf die Beine zu stellen. Du brauchst definitiv viel mehr Übung im Programmieren in C. :( Ich kann dir nicht jede einzelne Zeile Code immer wieder erklären. Du solltest dir schon selber erst mal genug Programmierkenntnisse in C aneignen, damit du überhaupt verstehst, wie man in C programmiert
-
Thread
Interrupts in Assembler und C
falsche operatoren - Setzen von Bits mit "oder" [c]EICRA |= ( (1<<ISC00) | (1<<ISC01) ); EIMSK |= (1<<INT0); // Interrupt zulassen! [/c]
// Tu was... Zaehler = 0; // ABER auch hier koennte der Interrupt die if-Abfrage unterbrechen :-( } } [/c]
-
Thread
Wofür #define PA0_PORT PORTADC?
bereits in den hardware-spezifischen header-Dateien zugewiesen werden. Z.B. in avr/iotn861a.h: [c] #define PA0_DDR DDRADC #define PA0_PORT PORTADC #define PA0_PIN PINADC #define PA0_BIT ADC0 [/c] Dabei sind PORTADC, ADC0 usw. nirgendwo definiert, d.h. es werden nur die Namen blockiert
np rn schrieb im Beitrag #2886223: > Wäre es nicht schick, wenn in den Headern ADCn als ADMUX bits definiert > würden? > z.B. > #define ADC1 1 > ... > #define ADC10 10 Naja, für die einzelnen Single-Ended-Kanäle mag das noch einigermaßen angehen, aber wenn du bei differenziellen Kanälen
-
Thread
Video Format Converter - FPGA
Ramon F. schrieb im Beitrag #2936197: > Jetz fällt mir aber auf, das ich pro Taktzyklus 18 Bit Input habe aber > nur 16 Bit Input für den Speicher habe. Wie sieht's mit einer Reduktion auf 5:6:5 aus? Würde Dir vielleicht 'ne Menge Kopfweh ersparen...
Dir auch mal den Schaltplan vom Xilinx SP605 anschauen (xtp067.pdf). Dort wird ein Chrontel CH7301C verwendet. Duke
-
Thread
AT89C51CC03 Alarmanlage
Verknüpfungen von Bit-Ergebnissen werden in C mit || oder && erledigt. Außerdem dürfte einer der Taster bei dem Board prellen. Also lies mal was über geeignete Entprellmethoden nach.
deinem Programm von 14:59Uhr fehlt eine Klammer nach while(1). Damit wird nur die erste if-else-Abfrage ausgeführt. Die 2. Abfrage steht nach der Endlosschleife einsam da.
-
Thread
Bitweise if-Abfrage durch switch-Anweisung ersetzen
Ist es möglich, eine if-Abfrage zu Stati von einzelnen Bits durch eine switch-case-Anweisung zu ersetzen? [c] ... #define BIT0 0x00 #define BIT1 0x01 #define BIT2 0x04 ... x = 0b01010101; if (x & (1<<BIT0) { ..... } if (x & (1<<BIT1) { ..... } if (x & (1<<BIT2) { ..... } [/c] switch-case-Versuch, der nicht geht: [c] ... switch (x) { case (&(1<<BIT0)): ...; break; case (&(1<<BIT1
-
Thread
Gibt es irgendwo brauchbare Infos zu SMI ?
Telefonkabel ist, das die Steuergeräte ohne jedes Protokoll verbindet. Man kann die Dinger ganz leicht einzeln und als Gruppe ansteuern, wenn man die richtigen Anschlüsse kurz schließt. Im Anhang als PDF die Dokumentation dazu (aus einem Australischen Forum, deshalb der Bezug zu C-Bus). Vielleicht spart
FF Antwort: FF Motor 1 99% 51 45 FD 6F FE Antwort: FF Pos.Abfrage Motor 0:70 05 8B Antwort 54.08%: EF 45 8A 71 D1 Pos.Abfrage Motor 1:71 05 8A Antwort 98.99%: EF 45 FD 6C 63 Motor 0 Stop: 50 00 B0 Motor 1 Stop: 51
-
Thread
EEPROM beim ATXMEGA in Assembler
einfachem Programm zu tun, einfach nur Assembler... mehr ist nicht nötig. Arbeite beruflich mit C++ und C#, aber gerade einen AVR programmieren, da ist Assebmler die Sprache überhaupt. Ich habe nur so vollständige Kontrolle über die einzelnen Schritte im Programm. Und Assembler ist eine feine
Bäcker kaufen, oder von mama schmieren lassen (konnte ich mir jetzt nicht verkneifen - sorry) in C hat man seine Libs usw, und oft weiss keiner genau, was da im einzelnen abläuft. Das ist nicht meine Welt... Schreiben eines Bytes an eine Speicherstelle im EEPROM Habe etwas probiert, und auch
-
Thread
Denke ich zu kompliziert?
thereof #define SAT16_MUL88(A, B) SAT16 (MUL88(A, B)) int16_t add3 (int16_t a, int16_t b, int16_t c) { return SAT16_MUL88 (SAT16_MUL88 (a, b), c); } [/c] Sieht alles ganz toll und aufgeräumt aus und ist gleichbedeutend mit: [c] typedef signed short int16_t; typedef signed long
int32_t) (b))) >> 8))) : (((int32_t) 1 << 16)))) : (-(((int32_t) 1 << 16))))))))) * ((int32_t) (c))) >> 8))) : (((int32_t) 1 << 16)))) : (-(((int32_t) 1 << 16))))))); }[/c]
-
Thread
Hygrostat für Terrarium bauen
Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } } Mein Vorhaben müsste es jetzt natürlich sein, das Register zu verstehen und zu den Werten eine "über oder unter Schwellwert Abfrage" zu programmieren. Hier wäre z.B. wenn ich das richtig
return f; } } Serial.print("Read fail"); return NAN; } float DHT::convertCtoF(float c) { return c * 9 / 5 + 32; } Kann mir Jemand sagen was die einzelnen Befehle in der Verkettung zu bedeuten haben?
-
Thread
Falsche Anzeige nach Spannungsverlust
"system.h"// Beinhaltet grundlegende Definitionen und Funktionen #include "bits.h" // Definiert die einzelnen Bits #include "lcd.h" // Funktionen für das LCD-Display #include "delay.h" // Funktionen zur Zeitverzögerung /* ** Definitionen */ #define B1 (PINA
UCSR1A = 0b00000000; UCSR1B = (1<<TXEN1)|(1<<RXEN1); // Senden und Empfangen UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); // UCSR1B = UCSR1B | 0b00011000; // Ermögliche Empfangen und Senden (Bit3 = 1, Bit4 = 1) // UCSR1C = UCSR1C | 0b10000110; // Setze Frame Format: 8 data (Bit1 = 1
-
Thread
Keine ADC-Kanal Adressierung möglich ATMEGA8
. Um ADCSRA nicht zu zermanschen, mit |= ADCSRA |= (1 << ADSC); [/c] Die Technik der Veroderns und VerANDens ist beim AVR gang und gäbe. Du kannst so in C gezielt einzelne Bits löschen und setzen, im Prinzip das, was die Assemblerbefehle CBI und SBI bzw. SBR und CBR auch machen. Zum Löschen eines Bits nimmst du die Komplementärfunktion in C. [c] ADCSRA &= ~(1<<ADFR); // als Beispiel mal das Freerun Bit löschen [/c] Die Wellenlinie ~ ist die Komplementärfunktion und das &= ist dann das VerANDen
-
Thread
Interrupt Fehlerquellen - FIFO Buffer
main-Variabeln und ISR-Variabeln das Problem lösen? Eine weitere Frage wäre, wie ist es bei if abfragen? Wenn ich das mache: 58: [c] if(wait_time == 0 && Buffer[index_read].sensor_answer == 0) [/c] wait_time ist eine uint16_t und Buffer[].sensor_answer ist 1 Bit gross! Wenn jetzt während dieser
][/c] der Compiler wissen, dass du den Index nur als vorzeichenlosen 8-Bit-Ausdruck berechnet haben willst. Bei [c]tmpindex_read--; ... Buffer[tmpindex_read][/c] wäre der Fall klar, da kann nichts
-
Thread
Beschleunigungssensor
Du musst folgendes beachten. Der ST hat nur ein 16 Bit output und nicht Auflösung. In dem 16 Bit Wert steht nur ein 12 Bit wert im zweierkomplement um 4 Bits nach links geshiftet drin. Du musst also sowas machen wie [c] int16_t acc_x; ... acc_x = SPI_MasterRead(OUTZ_H)<<8; acc_x |= (SPI_MasterRead(OUTZ_L))&0xFF; acc_x >>= 4; //um 4 Bits nach rechts [/c] Dann hast du den realen Wert, den du dann noch entsprechend deiner "Range" skalieren musst.
-
Thread
Anfängerprogramm TimerA MSP430
mit ID und FAST allen anderen Bitkombinationen. Es gibt manche, bei denen man wirklich selber die einzelnen Bits setzen muss, z.B. beim SVS (istbaber vielleicht auch abhängig von der Header-Datei).
& TIMERA0_VECTOR == TIMERA0_VECTOR ) // geht sicher viel besser { // do } } [/c] kann nicht funktionieren, da TAIV Bit0 immer /0/ ist und das untere Nibble des TIMERA0_VECTOR (0x0009) /1001/b ist. Somit ergibt die Abfrage immer /false/. Oder verstehe ich das falsch? Danke aber
-
Thread
MSP430 8 Werte von ADC über RS232 senden, geht nicht.
oder in irgendeiner anderen Funktion machen, als Loop also. Aber dann musst du halt immer das Flag abfragen: [c] sende_puffer { for( i = 0; i < PUFFERGROESSE; i++ ) { UART_TX_BUFFER = puffer[i]; while( UART_BUSY ) {} } } [/c] Aber das ist natürlich die unelegante Lösung, wenn es schon extra IFGs gibt. [/c]
-
Thread
Schalter einlesen Entprellen notwendig (kein Taster)
Danegger mit Timer-Verfahren auf die 4 Ports bekommen, also wie ich in get_key_press() alle 4 Ports Abfrage ob sich etwas geändert hat oder wie macht man das am Besten? http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29
dann die Schiebereien und Maskiererein WertPORT = WertPORT>> 2; // 2 rechts schieben // oberen 4 Bits maskieren, sodass diese gelöscht sind WertPORT= WertPORT& 0b00001111; // Variable invertieren und zwar nur die unteren 4 bits WertPORT= WertPORT^ 0b00001111; } [/c]
-
Thread
Ampelschaltung - Probleme bei der Synchronisation
else State <= A; end if; when B => State <= C; when C => if Globalcount = k then State <= D; else State <= C; end if; when D => if Globalcount = 3 then State <=
erhalte ich nun die folgenden Warnungend es Synopsis-Compilers: Pruning register CLK_EN Register bit Count(0) is always 0, optimizing ... |Register bit Count(1) is always 0, optimizing ... Register bit Count(2) is always 0, optimizing ... |Register bit Count(3) is always 0, optimizing ... Found