Hallo Zusammen, nachdem ich jetz schon einige Tage rumsuche und rumprobiere, komme ich an einem eigenen Thread nicht vorbei. Ich habe folgendes Problem: Ich habe mit einem ATtiny88 einen Berührungssensor aufgebaut. Als Rückmeldung leuchten einige LEDs wenn ein bestimmter Schwellwert erreicht wird. Das funktioniert alles wunderbar, jedoch nur wenn ich im QTAnalyzer auf Start Reading gedrückt habe. Beende ich den Lesevorgang bleibt der µC in seiner aktuellen Position stehen. (Wenn beim Beenden die LEDs geleuchtet haben, bleiben sie auch an). Ich habe zur Kontrolle eine LED auf dauerlicht geschaltet. Diese Leuchtet immer. Irgendwas muss er also doch machen. Ich habe irgendwie den Verdacht dass die Interne Clock nicht Arbeitet. Die SUT_CKSEL ist aber auf die interne (default) Clock eingestellt. Am ~Reset PIN liegt über einem 1k Widerstand VCC (3,3V). Zum Flashen per SPI benutze ich das Controlboard vom QT600. Ich Programmiere mit Atmel Studio 6 mit der QTouch extension. Bitte um Hilfe, bin bei µC Programmierung noch sehr neu. Habe auch versucht über ein Labornetzgerät nur die Spannungsversorgung auf das Board zu bringen. Der µC Startet aber auch hier nicht. (Aber Kontroll LED Leuchtet) Vielen Dank schonmal für eure Hilfe Gruß Flo
Flo schrieb: > Ich habe irgendwie den Verdacht dass die Interne Clock nicht Arbeitet. Vergiss diese Vermutungen gleich wieder. Die internas des µC sind etwas, dass zwar nicht über jeden Verdacht erhaben ist, welche man allerdings als allerletztes verdächtigt. Gleich nach einem Fehler des Compilers. Sehr viel wahrscheinlicher, und zwar mit Prozentzahlen größer als 99%, ist es hingegen, dass das Problem von dir durch entweder die Aussenbeschaltung und/oder das Programm verursacht wurde. > Vielen Dank schonmal für eure Hilfe Schaltpläne + Programm. Sonst kann dir hier keiner weiter helfen.
Das Grundgerüst des Programms wurde vom QTouch Assistenten erstellt, von mir ist lediglich die LED Ansteuerung. Ich kann auch das Projekt hochladen wenn das Sinnvoll ist.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #define __delay_cycles(n) __builtin_avr_delay_cycles(n)
|
4 | #define __enable_interrupt() sei()
|
5 | |
6 | #include "touch_api.h" |
7 | #include "touch.h" |
8 | #include "QDebug.h" |
9 | /*----------------------------------------------------------------------------
|
10 | macros
|
11 | ----------------------------------------------------------------------------*/
|
12 | |
13 | #define GET_SENSOR_STATE(SENSOR_NUMBER) qt_measure_data.qt_touch_status.sensor_states[(SENSOR_NUMBER/8)] & (1 << (SENSOR_NUMBER % 8))
|
14 | #define GET_ROTOR_SLIDER_POSITION(ROTOR_SLIDER_NUMBER) qt_measure_data.qt_touch_status.rotor_slider_values[ROTOR_SLIDER_NUMBER]
|
15 | |
16 | /*----------------------------------------------------------------------------
|
17 | LED Controll
|
18 | ----------------------------------------------------------------------------*/
|
19 | |
20 | void LED_ON (void) { |
21 | |
22 | DDRB = 0xFF; |
23 | DDRD = 0xFF; |
24 | |
25 | PORTB &= ~((1<<6) | (1<<7)); |
26 | PORTD &= ~((1<<5) | (1<<6) | (1<<7)); |
27 | |
28 | |
29 | }
|
30 | |
31 | |
32 | void LED_OFF (void){ |
33 | |
34 | DDRB = 0xFF; |
35 | DDRD = 0xFF; |
36 | |
37 | PORTB |= ((1<<6) | (1<<7)); |
38 | PORTD |= ((1<<5) | (1<<6) | (1<<7)); |
39 | }
|
40 | |
41 | |
42 | void Kontroll_LED (void) |
43 | {
|
44 | |
45 | DDRA = 0xFF; |
46 | PORTA &= ~(1<<3); |
47 | }
|
48 | |
49 | |
50 | /*----------------------------------------------------------------------------
|
51 | My Variables
|
52 | ----------------------------------------------------------------------------*/
|
53 | uint32_t i=0; |
54 | uint32_t count=0; |
55 | uint16_t My_Delta=0; |
56 | /*----------------------------------------------------------------------------
|
57 | prototypes
|
58 | ----------------------------------------------------------------------------*/
|
59 | extern void touch_measure(void); |
60 | extern void touch_init( void ); |
61 | extern void init_system( void ); |
62 | extern void init_timer_isr(void); |
63 | extern void set_timer_period(uint16_t); |
64 | |
65 | |
66 | /*----------------------------------------------------------------------------
|
67 | Structure Declarations
|
68 | ----------------------------------------------------------------------------*/
|
69 | |
70 | /*----------------------------------------------------------------------------
|
71 | Touch Delta
|
72 | ----------------------------------------------------------------------------*/
|
73 | |
74 | /*void my_touch_data (void)
|
75 | {
|
76 |
|
77 | if (qt_measure_data.channel_signals[CHANNEL_0]<30u)
|
78 | { My_Delta = qt_measure_data.channel_signals[CHANNEL_0];}
|
79 | else{ My_Delta = 100;}
|
80 |
|
81 | }
|
82 | |
83 | /*----------------------------------------------------------------------------
|
84 | global variables
|
85 | ----------------------------------------------------------------------------*/
|
86 | /* Timer period in msec. */
|
87 | uint16_t qt_measurement_period_msec = QT_MEASUREMENT_PERIOD_MS; |
88 | uint16_t time_ms_inc=0; |
89 | extern uint8_t my_sensor_delta; |
90 | /*----------------------------------------------------------------------------
|
91 | Delay Loop
|
92 | ----------------------------------------------------------------------------*/
|
93 | /*void delay (void)
|
94 | {
|
95 | count = (4*65536);
|
96 | for (i=0;i<count;i++);
|
97 |
|
98 | }
|
99 | |
100 | /*----------------------------------------------------------------------------
|
101 | static variables
|
102 | ----------------------------------------------------------------------------*/
|
103 | |
104 | /* flag set by timer ISR when it's time to measure touch */
|
105 | volatile uint8_t time_to_measure_touch = 0u; |
106 | |
107 | /* current time, set by timer ISR */
|
108 | volatile uint16_t current_time_ms_touch = 0u; |
109 | |
110 | /*============================================================================
|
111 | Name : main
|
112 | ------------------------------------------------------------------------------
|
113 | Purpose : main code entry point
|
114 | Input : n/a
|
115 | Output : n/a
|
116 | Notes :
|
117 | ============================================================================*/
|
118 | |
119 | int main( void ) |
120 | {
|
121 | |
122 | /* initialise host app, pins, watchdog, etc */
|
123 | init_system(); |
124 | |
125 | /* configure timer ISR to fire regularly */
|
126 | init_timer_isr(); |
127 | |
128 | /* Initialize Touch sensors */
|
129 | touch_init(); |
130 | |
131 | /* enable interrupts */
|
132 | __enable_interrupt(); |
133 | |
134 | /* loop forever */
|
135 | for( ; ; ) |
136 | {
|
137 | extern void Transmit_Delta(void); |
138 | touch_measure(); |
139 | |
140 | Kontroll_LED(); |
141 | |
142 | |
143 | |
144 | if( my_sensor_delta > 1u){ |
145 | |
146 | LED_ON(); |
147 | }
|
148 | |
149 | else { LED_OFF(); |
150 | |
151 | |
152 | }
|
153 | |
154 | |
155 | /* Time Non-critical host application code goes here */
|
156 | |
157 | }
|
158 | |
159 | }
|
:
Bearbeitet durch User
Ach ja, Ich Flashe mit JP1 und lese dann mit JP2 aus. Es soll aber wenn es fertig ist nur über den XF2J Betrieben werden
Zuallererst mal haben wir wieder mal das übliche: Keine Blockkondensatoren an den Versorgungsspannungsanschlüssen. Praktisch jeder Thread, in dem von seltsamen Problemen berichtet wird, bzw. in dem jemand bittet über seine Schaltung drüber zu schauen, hat immer wieder das gleiche grundsätzliche Problem: keine Blockkondensatoren. Die sind nicht da, damit die Kondensatorindustrie auch etwas verdient! Die haben eine Funktion! Das hier
1 | void LED_ON (void) { |
2 | |
3 | DDRB = 0xFF; |
4 | DDRD = 0xFF; |
no. erstens willst du nicht ständig am DDRx Register rumfummeln, sondern das macht man genau einmal, nämlich am Programmanfang. Zweitens ist das 'Ich setze einfach mal alle Pins auf Ausgang' nicht die Methode der Wahl. WEnn du von einem Port nur 3 Pins auf Ausgang brauchst, weil dort 3 LED hängen, dann schalte gefälligst auch nur die 3 Ausgänge auf Ausgang und lass die anderen Pins in Ruhe! Andere Programmteile verlassen sich unter Umständen darauf, dass sie die Datenrichtung für 'ihre' Pins einstellen und anderer Code ihnen da nicht ins Handwerk pfuscht.
:
Bearbeitet durch User
Karl Heinz schrieb: > Zuallererst mal haben wir wieder mal das übliche: > Keine Blockkondensatoren an den Versorgungsspannungsanschlüssen. > Praktisch jeder Thread, in dem von seltsamen Problemen berichtet wird, > bzw. in dem jemand bittet über seine Schaltung drüber zu schauen, hat > immer wieder das gleiche grundsätzliche Problem: keine > Blockkondensatoren. Die sind nicht da, damit die Kondensatorindustrie > auch etwas verdient! Die haben eine Funktion! Oder sollen C4 und C3 die Blockkondensatoren darstellen? In dem Fall, und wenn die baulich an den µC-Pins sitzen, nehm ich alles zurück und behaupte das Gegenteil.
Hallo karl Heinz, danke für deine Antwort Karl Heinz schrieb: > > Zweitens ist das 'Ich setze einfach mal alle Pins auf Ausgang' nicht die > Methode der Wahl. WEnn du von einem Port nur 3 Pins auf Ausgang > brauchst, weil dort 3 LED hängen, dann schalte gefälligst auch nur die 3 > Ausgänge auf Ausgang und lass die anderen Pins in Ruhe! Ich hatte vorher nur die Pins die ich brauche auf Ausgang, allerdings funktionierte dann das Auslesen nichtmehr, nachdem ich alle als Ausgang definiert hatte funktionierte das wieder. Ich werd das dann im Programm weiter nach oben schieben. C3 und C4 sind zwischen VCC und Ground geschalten und auch physikalisch nahe am µC. Kannst du mir erklären warum es funktioniert wenn der Analyzer läuft, aber nur mit Spannung nicht? Wie gesagt, ich hatte den verdacht dass die interne Clock nicht angeschaltet ist, scheint aber flasch zu sein.
Flo schrieb: > Ich hatte vorher nur die Pins die ich brauche auf Ausgang, allerdings > funktionierte dann das Auslesen nichtmehr das wird aber nicht besser, wenn du der QTouch Lib ins Handwerk pfuscht. >, nachdem ich alle als Ausgang > definiert hatte funktionierte das wieder. Wenn überhaupt, dann war das Zufall. Das es in Wirklichkeit nicht funktioniert, siehst du ja. Sonst würdest du nicht fragen. > C3 und C4 sind zwischen VCC und Ground geschalten und auch physikalisch > nahe am µC. Gut. Dann nehm ich alles zurück. > Kannst du mir erklären warum es funktioniert wenn der Analyzer läuft, > aber nur mit Spannung nicht? Wie gesagt, ich hatte den verdacht dass die > interne Clock nicht angeschaltet ist, scheint aber flasch zu sein. Weil dein Analyzer als Messgerät auch irgendwie das Messobjekt verändert. Wo genau ist der denn angeschlossen? Wie sieht die Anbindung der kapazitiven Sensoren aus? Hast du deinen Tiny schon mal ohne diesem QTouch einem Test unterzogen? Einfach nur 2 LED blinken lassen und sonst nichts? Läuft er dann? Sozusagen ein "ist die grundsätzliche Hardware eigentlich in Ordnung"-Test?
:
Bearbeitet durch User
> das wird aber nicht besser, wenn du der QTouch Lib ins Handwerk pfuscht. Ich weis es leider nicht besser, wenn ich nur die benötigten Pins für die LEDs als Ausgang schalte kann ich keine Auswertung mit dem QTouch Analyzer machen. > Wenn überhaupt, dann war das Zufall. > Das es in Wirklichkeit nicht funktioniert, siehst du ja. Sonst würdest > du nicht fragen. > > Weil dein Analyzer als Messgerät auch irgendwie das Messobjekt > verändert. Wo genau ist der denn angeschlossen? > Wie sieht die Anbindung der kapazitiven Sensoren aus? > Nur um sicherzugehen dass wir vom selben sprechen, mit Analyzer meine ich das Auswerttool von Atmel Studio das mir auch die Intensität des Touchs ausgibt. Keinen Spektrumanalyzer. > Hast du deinen Tiny schon mal ohne diesem QTouch einem Test unterzogen? > Einfach nur 2 LED blinken lassen und sonst nichts? Läuft er dann? > Sozusagen ein "ist die grundsätzliche Hardware eigentlich in > Ordnung"-Test? Ja das habe ich und darauf begründet sich auch meine Frage. Wenn ich den QT weglasse leuchtet nur die Kontroll LED, sonst passiert garnichts.
Flo schrieb: > Wenn ich den > QT weglasse leuchtet nur die Kontroll LED, sonst passiert garnichts. Dann lass uns erst mal den Teil abklären. Testprogramm
1 | #define F_CPU 1000000UL
|
2 | |
3 | #include <avr/io.h> |
4 | #include <utils/delay.h> |
5 | |
6 | #define LED1 PA3
|
7 | #define LED2 PB6
|
8 | |
9 | int main() |
10 | {
|
11 | DDRA |= ( 1 << LED1 ); |
12 | DDRB |= ( 1 << LED2 ); |
13 | |
14 | PORTA &= ~( 1 << LED1 ); |
15 | PORTB &= ~( 1 << LED2 ); |
16 | |
17 | _delay_ms( 1000 ); |
18 | |
19 | PORTB |= ( 1 << LED2 ); |
20 | |
21 | while( 1 ) |
22 | {
|
23 | PORTA |= ( 1 << LED1 ); |
24 | _delay_ms( 500 ); |
25 | PORTA &= ~( 1 << LED1 ); |
26 | _delay_ms( 1000 ); |
27 | }
|
28 | }
|
erwartetes Verhalten: Wenn der µC resettet wird (entweder nach dem Brennen oder nach dem Anlegen der Betriebsspannung) leuchten die beiden LED, die in deinem Schaltplan mit LED1 und LED2 bezeichnet sind. Nach 1 Sekunde geht LED2 aus und darf danach nie wieder aufleuchten, während LED1 zu blinken anfängt. Die Dunkelphasen sind ca. 0.5 Sekunden lang, die Hellphasen der Led sind ca 1 Sekunde lang. Und das darf sich nicht ändern. Egal ob du einen Analyser drann hast oder nicht. Weder darf LED1 zu blinken aufhören, noch darf LED2 erneut aufleuchten (es sei denn du nimmst den Strom weg und legst ihn wieder an). Auch müssen die Zeiten ziemlich gut stimmen (ich geh mal davon aus, dass du nicht an den Fuses gespielt hast und der Tiny noch immer auf 1Mhz eingestellt ist) Wenn das so ist, dann ist dein µC einsatzbereit und die Hardware so gesehen erst mal in Ordnung. Probier alles mögliche aus, was du in Verdacht hast, dass es den µC beeinflussen könnte. Weder darf das Blinken aufhören oder sich verhaspeln, noch darf LED2 erneut aufleuchten.
:
Bearbeitet durch User
Habe den Code von dir jetz mal draufgeladen, allerdings erkennt er bei
mir die
> #include <utils/delay.h>
nicht. hab das rausgetan und die delays durch entsprechende
"for-schleifen" ersetzt. Ich weis. ist nicht so schön wie die interrupts
:D
uint16_t i;
for(i=0;i<65000;i++;)
es tut sich leider garnichts, weder mit dem QT noch ohne
Hab zwischenzeitlich nen neuen µC draufgepackt weil ich mich durch
rumprobieren ausgeschlossen hab :D
Flo schrieb: >> #include <utils/delay.h> sollte bestimmt #include <util/delay.h> heißen, dort ist wohl ein s dazwischen gerutscht.
delay schrieb: > Flo schrieb: >>> #include <utils/delay.h> > sollte bestimmt > #include <util/delay.h> > heißen, dort ist wohl ein s dazwischen gerutscht. :-) Ja das passiert mir öfter.
Stimmt, Ja. Funktioniert leider trotzdem nichts :/
Flo schrieb: > Habe den Code von dir jetz mal draufgeladen, allerdings erkennt er bei > mir die >> #include <utils/delay.h> > > nicht. hab das rausgetan und die delays durch entsprechende > "for-schleifen" ersetzt. Ich weis. ist nicht so schön wie die interrupts > :D Sind auch keine Interrupts. _delay_ms expandiert ebenfalls zu Warteschleifen. Nur funktionieren die dann auch, weil man dem Compiler verbietet sie wegzuoptimieren. Also. Die _delay_ms wieder rein, und den Directory Namen korrigieren.
Hab ich gerade gemacht, hat sich jetzt ein bisschen überschnitten. Leuchtet leider nichts :/
Flo schrieb: > Stimmt, Ja. > > Funktioniert leider trotzdem nichts :/ Dann ist aber was mächtig faul im Staate Dänemark mit deiner Hardware Denn ein noch einfacheres Testprogramm kann es kaum geben.
Also: ganzen Prozess nochmal durchgehen. Hast du das richtige Hex-File gebrannt? Gibt es vom Brenner eine Fehlermeldung? Kannst du das gebrannte Programm vom µC wieder auslesen und stimmt das mit dem Hex-File überein? (die Verify Funktion im Brennprogramm) Welcher Pegel liegt am Reset-Pin des Tiny an? Sind alle Versorgunsspannungen am Tiny dort wo sie hingehören? Sind vielleicht die LED verkehrt rum eingelötet? Sichtung der Platine: Kurzschlüsse? Leiterbahnunterbrechungen? (Als letztes: Wenn möglich, alles bis auf die beiden LED und ihre Widerstände mal runternehmen, so dass garantiert nix anderes den µC beeinflussen kann)
:
Bearbeitet durch User
Karl Heinz schrieb: > Also: ganzen Prozess nochmal durchgehen. > > Hast du das richtige Hex-File gebrannt? Ja, ich hab extra nachgesehen ob er das .hex oder das.elf auswählt > Gibt es vom Brenner eine Fehlermeldung? Nein, Erasing device...OK Programming Flash...OK Verify Flash...OK > Kannst du das gebrannte Programm vom µC wieder auslesen und stimmt das > mit dem Hex-File überein? (die Verify Funktion im Brennprogramm) Verify funktioniert. Wenn ich das HEX mit Read auslese und es im Texteditor vergleiche, sieht es für mich so aus als hätte er das ganze "aufgefüllt" mit vielen FFFFFF. Die ersten 10 Zeilen sind identisch, das Original endet hier. > Welcher Pegel liegt am Reset-Pin des Tiny an? 3,3V > Sind alle Versorgunsspannungen am Tiny dort wo sie hingehören? VCC und AVCC sind an 3,3V > Sind vielleicht die LED verkehrt rum eingelötet? Nein, hab ich extra nochmal überprüft > > Sichtung der Platine: Kurzschlüsse? Leiterbahnunterbrechungen? Hab jetzt fragwürdige stellen nochmal nachgelötet (zwischen den Beinchen des µC) > (Als letztes: Wenn möglich, alles bis auf die beiden LED und ihre > Widerstände mal runternehmen, so dass garantiert nix anderes den µC > beeinflussen kann) Hab jetzt nochmal ein komplett jungräuliches Projekt erstellt nur mit deinem Code drin. Jetz funktionierts. Es passiert folgendes. Sobald spannung anliegt Leuchten LED1 und LED2 gleichzeitig für ca 0,5-1 sek, danach erlischt LED2. LED1 blinkt etwa mit 1HZ.
Also das Testprogramm geht jetzt. habe gerade nochmal versucht in meinem Programm nur die Pins die ich auch wirklich brauche als Ausgang zu definieren sowie die Pins die die SPI Schnittstelle richtig zu definieren. hat allerdings keinen sichtbaren Erfolg gebracht. Der µc bleibt nachwievor einfach in seinem Zustand sobald man das Auslesen beendet. Mit Spannung alleine Startet er erst garnicht. nur die Kontroll-LED leuchtet.
> Hab jetzt nochmal ein komplett jungräuliches Projekt erstellt nur mit deinem
Code drin. Jetz funktionierts.
Das ist dubios.
Das legt bei mir die Vermutung nahe, dass in deinem ursprünglichen
Projekt zb der falsche Prozessor eingestellt war.
Soo, ich habe jetz wieder ein Jungfräuliches TouchSensor Programm vom Assistenten generieren lassen und einfach eine einzelne LED blinken lassen. Jetz hat sich herrausgestellt dass ich diese LED niewieder löschen kann. Hab den Chip zwar jetz schon mindestens 10x gelöscht bevor ich ihn neu beschrieben habe, aber die LED bleibt auf dauerlicht gestzt, obwohl der CODE auskommentiert ist. :/ wird irgendwie immer seltsamer
Flo schrieb: > Soo, ich habe jetz wieder ein Jungfräuliches TouchSensor Programm vom > Assistenten generieren lassen Wie umfangreich ist dieses QTouch Zeugs? Wenns nicht zu umfnagreich ist, dann stell doch bitte mal hier ein. Ich verwende dieses Zeugs nicht (und auch keinen Assistenten :-), daher kann ich dazu nicht viel sagen. Aber ich kann mir mal ansehen, was der Assistent da eigentlich so alles erzeugt :-)
Ich hab das ganze Projekt jetz mal gepackt und angehängt. Ich kann ncht ganz beurteilen wie umfangreich das ist :D die Main hab ich ja schon gepostet. In diesem projekt hab ich jetzt nur die blink LED drin. die touch erkennung habe ich in einem anderen Projekt aus der QDEBUG.c genommen, aus "Transmit_delta".
2 Dinge sind mir in deinem Code aufgefallen. Du hast zwar eine schöne Funktion Output_Settings, rufst sie aber nie auf
1 | int main( void ) |
2 | {
|
3 | |
4 | /* initialise host app, pins, watchdog, etc */
|
5 | init_system(); |
6 | |
7 | /* configure timer ISR to fire regularly */
|
8 | init_timer_isr(); |
9 | |
10 | /* Initialize Touch sensors */
|
11 | touch_init(); |
12 | |
13 | /* enable interrupts */
|
14 | __enable_interrupt(); |
15 | |
16 | /* loop forever */
|
17 | for( ; ; ) |
du musst sie schon auch mal irgendwo aufrufen, damit sie einen Effekt hat und die Pins auf Ausgang schaltet. Das andere ist. In touch.h, ganz unten
1 | /******************************************************************************
|
2 | * Debug Interface Settings
|
3 | ******************************************************************************/
|
4 | |
5 | |
6 | #define _DEBUG_INTERFACE_
|
7 | |
8 | /* SPI Master */
|
9 | #define QDEBUG_SPI
|
d.h. da ist Debugging aktiviert und das Debugging findet auf der SPI statt. Sicher, dass du das willst? Denn dann gibt der Code alle möglichen Statusmeldungen über die eingestellte Schnittstelle aus. Was grundsätzlich nicht schlecht ist, aber natürlich auch wieder eine weitere Fehlerquelle darstellt. Ich würde mich mal in touch.c
1 | void touch_measure(void) |
2 | {
|
3 | |
4 | /*status flags to indicate the re-burst for library*/
|
5 | static uint16_t status_flag = 0u; |
6 | static uint16_t burst_flag = 0u; |
7 | |
8 | if( time_to_measure_touch ) |
9 | {
|
10 | |
11 | /* clear flag: it's time to measure touch */
|
12 | time_to_measure_touch = 0u; |
13 | |
14 | do { |
15 | #ifdef _DEBUG_INTERFACE_
|
16 | TIMESTAMP0; |
17 | #endif
|
18 | |
19 | /* one time measure touch sensors */
|
20 | status_flag = qt_measure_sensors( current_time_ms_touch ); |
21 | |
22 | #ifdef _DEBUG_INTERFACE_
|
23 | TIMESTAMP2; |
24 | #endif
|
25 | |
26 | burst_flag = status_flag & QTLIB_BURST_AGAIN; |
27 | |
28 | #ifdef _DEBUG_INTERFACE_
|
29 | /* send debug data */
|
30 | QDebug_SendData(status_flag); |
31 | /* Process commands from PC */
|
32 | QDebug_ProcessCommands(); |
33 | #endif
|
34 | |
35 | #ifdef _DEBUG_INTERFACE_
|
36 | TIMESTAMP3; |
37 | #endif
|
38 | |
39 | /* Time-critical host application code goes here */
|
40 | |
41 | }while (burst_flag) ; |
42 | |
43 | }
|
44 | |
45 | #ifdef _DEBUG_INTERFACE_
|
46 | TIMESTAMP4; |
47 | #endif
|
48 | |
49 | /* Non-Time critical host application code goes here */
|
50 | |
51 | #ifdef _DEBUG_INTERFACE_
|
52 | TIMESTAMP5; |
53 | #endif
|
54 | /* Host sleep code goes here */
|
55 | |
56 | }
|
auf die while Schleife konzentrieren. Das ist eine potentielle Endlosschleife, wenn bust_flag nie FALSE wird. Damit burst_flag FALSE werden kann, muss hier
1 | burst_flag = status_flag & QTLIB_BURST_AGAIN; |
im status_flag das Bit QTLIB_BURST_AGAIN gelöscht sein. status_flag kommt von hier
1 | status_flag = qt_measure_sensors( current_time_ms_touch ); |
d.h. in der Funktion würde ich mal reinschnuppern, wie da die Logik funktioniert. Unglücklicherweise kann ich aber die Funktion dafür nicht finden. Ist die in der libavr25g1-4qt-k-0rs.a drinnen?
:
Bearbeitet durch User
Flo schrieb: > Das funktioniert alles wunderbar, jedoch nur wenn ich im > QTAnalyzer auf Start Reading gedrückt habe. Das klingt nach aktiviertem Debug-Code. Der Q-Touch Composer erzeugt leider auch in der neuesten Version etwas merkwürdigen Code. Zum Beispiel ist es nicht möglich, einen Quarz ungleich 8MHz zu benutzen, das ganze Konstrukt ist auf den RC-Oscillator abgestimmt und der µC wird mit 4MHz betrieben. Wenn man versucht das zu ändern muss man ziemlich tief im Code graben und dann funktionieren entweder die Buttons nicht mehr oder die Debug-Ausgabe oder gleich beides. Und das mit ansonstem nackten Projekt, ohne eigenen Code. Dokumentation findet genau wie beim ASF quasi nicht statt. Ich hatte Atmel schon angeschrieben deshalb, die Antworten lassen mich aber stark vermuten, dass dort meine Fragen nicht verstanden wurden da ich auf nochmalige Nachfrage mit quoten derer Mail als Bezug erneut die gleiche nutzlose Antwort erhalten habe die ein wenig an der Frage vorbei ging. Ist jetzt alles schon wieder ein paar Monate her und ich hatte mich auch nur damit beschäftigt um einen Kollegen zu unterstützen. Aber Bock habe ich auf den Kram nicht mehr wirklich, gezwungen zu sein den µC auf 4MHz zu benutzen finde ich nicht wirklich komisch. Und die nächste Version vom Q-Touch Composer hat das dann nicht etwa verbessert, der fragliche Code wurde noch schwerer zu finden. :-(
Ach ja, wir haben ein Board mit einem Mega88PA und eines mit einem Mega164PA aufgebaut. Beim Mega88PA erfolgt die Debug-Ausgabe per TWI, der Q-Touch Composer kann den Mega164PA nur per Software-SPI Debug-Ausgaben machen. Wobei man villeicht noch erklären muss das Debug-Ausgaben sich auf die Messwerte der Touch-Sensoren bezieht, das kann man mit dem Q-Touch Analyser visualisieren wenn man denn das QT600-Kit hat das diese Daten auf den USB umsetzt. Ich finde das Zeug reichlich halbgar.
> /* Process commands from PC */ > QDebug_ProcessCommands(); Wartet der µC hier auf eine Antwort ? (Die niemals kommt wenn du das Kabel abziehst !) Am besten mal den Debugmode ausschalten und dann versuchen das Kabel abzuziehen.
Vielen Dank für die vielen Tipps, werd mich heute wieder stark dahinterklemmen und eure Tipps durcharbeiten, gebe dann wieder Rückmeldung. Es ist schon so, dass Ich mit dem Qtouch Analyzer die Messwerte des Touchsensors visualisiere. Das ist aber nur jetzt am anfang wichtig. Später wenn ich das Ding eingebaut habe und es funktioniert interessieren mich ja die Werte nichtmehr, nur die Funktion. Werde also versuchen den Debug-mode wie von euch beschrieben abzuschalten. Viele Grüße, Flo
Soweit ich das jetz sehe liegt das Problem in der Auswertung des Touches, die meiner Ansicht nach nur aktiv ist wenn der µC im Debug-Modus ist. Habe die Kontroll-LED mal auf blinken gemacht und nur vom Labornetzgerät die 3,3V angelegt. Das funktioniert! Bis jetzt habe ich die Touch erkennung des generierten Codes genommen. Habt ihr eine Idee wie ich das anders machen kann? Habe die Variable delta aus QDebug.c dazu verwendet.
Bin langsam echt am verzweifeln. Das muss doch gehen. Steuert die SPI schnittstelle evtl meinen µC und enabled die Touch-auswertung?
Rudolph schrieb: > Wobei man villeicht noch erklären muss das Debug-Ausgaben sich auf die > Messwerte der Touch-Sensoren bezieht, das kann man mit dem Q-Touch > Analyser visualisieren wenn man denn das QT600-Kit hat das diese Daten > auf den USB umsetzt. Ich verwende genau was du schreibst. Kann es sein dass die Messwerte nur verfügbar sind wenn der Analyzer angeschlossen ist? Ich verwende nämlich für meine Touchanzeige eine Variable aus der QDebug.c
Habs nicht mehr im Kopf, da gibt es aber eine Funktion mit der man den Status von Buttons abfragen kann. Also Delta ist ja nicht ganz richtig, Du willst ja wissen ob der Taster über der eingestellten Schwelle ist. Das ganze Geraffel scheint mir im wesentlich Marketing zu sein, ernsthaft scheint man sich bei Atmel damit nicht zu beschäftigen. Genauso wie diese undokumentierte Sammlung von inkonsistentem Code die Atmel ASF nennt. Das könnte richtig hilfreich sein.
Rudolph schrieb: > Habs nicht mehr im Kopf, da gibt es aber eine Funktion mit der man den > Status von Buttons abfragen kann. > > Also Delta ist ja nicht ganz richtig, Du willst ja wissen ob der Taster > über der eingestellten Schwelle ist. Stimmt, delta ist nicht ganz richtig, das Delta wird anscheinend nur gebildet wenn der Debugmodus aktiv ist. Ich hab jetzt nochmal ganz viel rumprobiert und es zum laufen gekriegt so wie ich es will. Es funktioniert jetz mir einer konstruktion aus Status_Flag und Burst_Flag. Ich möchte mich bei allen die mir geholfen haben nochmals herzlichst bedanken. Danke, dass ihr euch die Zeit genommen habt und für eure mühe :) Von meiner Seite aus kann man das Thema abschließen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.